Вам нужно использовать скобки, если имена свойств имеют специальные символы:
var foo = {
"Hello, world!": true,
}
foo["Hello, world!"] = false;
Кроме этого, я полагаю, это просто вопрос вкуса. IMHO, точечное обозначение короче и делает более очевидным, что это свойство, а не элемент массива (хотя, конечно, JavaScript не имеет ассоциативных массивов).
С ruby 1.9.2 вы можете использовать режим r:bom|utf-8
text_without_bom = nil #define the variable outside the block to keep the data
File.open('file.txt', "r:bom|utf-8"){|file|
text_without_bom = file.read
}
или
text_without_bom = File.read('file.txt', encoding: 'bom|utf-8')
или
text_without_bom = File.read('file.txt', mode: 'r:bom|utf-8')
Он не делает Не имеет значения, если спецификация доступна в файле или нет.
Вы также можете использовать опцию кодирования с другими командами:
text_without_bom = File.readlines(@filename, "r:utf-8")
(вы получаете массив со всеми строками).
Или с CSV:
require 'csv'
CSV.open(@filename, 'r:bom|utf-8'){|csv|
csv.each{ |row| p row }
}
Я бы не слепо пропустил первые три байта; что, если продюсер останавливает , добавив снова спецификацию? Что вам нужно сделать, это проверить первые несколько байтов, а если они 0xEF 0xBB 0xBF, игнорировать их. Это форма, в которой используется символ спецификации (U + FEFF) в UTF-8; Я предпочитаю иметь дело с ним, прежде чем пытаться декодировать поток, потому что обработка спецификации настолько несовместима с одним языком / инструментом / структурой до следующего.
На самом деле, так вы предположили , чтобы иметь дело с спецификацией. Если файл был подан как UTF-16, перед началом декодирования вам нужно проверить первые два байта, чтобы вы знали, следует ли считать его как big-endian или little-endian. Конечно, спецификация UTF-8 не имеет никакого отношения к порядку байта, это просто означает, что вы знаете, что кодировка UTF-8, если вы этого еще не знали.
Я не буду «доверять» некоторому файлу, который будет закодирован как UTF-8, когда присутствует спецификация 0xEF 0xBB 0xBF, вы можете потерпеть неудачу. Обычно при обнаружении спецификации UTF-8, это действительно должен быть файл с кодировкой UTF-8, конечно. Но, если, например, кто-то только что добавил спецификацию UTF-8 в файл ISO, вы не смогли бы так плохо кодировать такой файл, если в нем есть байты, которые превышают 0x0F. Вы можете доверять файлу, если у вас есть только байты до 0x0F внутри, потому что в этом случае это ASCII-файл, совместимый с UTF-8, и в то же время он является допустимым файлом UTF-8.
Если есть это не только байты & lt; = 0x0F в файле (после спецификации), чтобы быть уверенным, что он правильно закодирован в кодировке UTF-8, вам нужно будет проверить допустимые последовательности и - даже если все последовательности действительны - проверьте также, если каждый код из последовательности использует кратчайшую возможную последовательность и проверяет также, нет ли кодового пункта, который соответствует высокому или низкому суррогату. Также проверьте, не превышает ли максимальные байты последовательности не более 4, а самый высокий код - 0x10FFFF. Наивысший уровень кодирования ограничивает также биты полезной нагрузки старшего байт не выше 0x4 и полезную нагрузку первого следующего байта не выше 0xF. Если все упомянутые проверки успешно пройдены, ваша спецификация UTF-8 говорит правду.
:encoding => "r:bom|utf-8"
в CSV foreach, но он все еще читает спецификацию, как если бы она была частью первого столбца заголовка. – Aaron 9 October 2012 в 14:30CVS.read(filename, :encoding => 'utf-8')
вы можете установить кодировку с помощью CSV (или этоCSV.load
?). Я думаю, что это тоже возможно с помощью bom-logic::encoding => 'bom|utf-8')
. Я не могу проверить это на самом деле - извините. – knut 11 October 2012 в 15:45file = File.open(@filename, 'r:bom|utf-8')
csv = CSV.new(file, faster_csv_options)
csv.each do |row|
...
file.close
– Aaron 11 October 2012 в 16:37File.open(@filename, 'r:bom|utf-8'){|file| csv = CSV.new(file, faster_csv_options) csv.each{ |row| p row } }
или даже короче, я успешно тестировал:CSV.open(@filename, 'r:bom|utf-8', faster_csv_options){|csv| csv.each{ |row| p row } }
иCSV.read(@filename, 'r:bom|utf-8').each{|row| p row }
– knut 11 October 2012 в 17:34text_without_bom = File.read('file.txt', mode: 'r:bom|utf-8')
– Matt Huggins 30 November 2015 в 23:26