Строка # to_i не работает при использовании строкового объекта, обработанного из файла csv [duplicate]

Вам нужно использовать скобки, если имена свойств имеют специальные символы:

var foo = {
    "Hello, world!": true,
}
foo["Hello, world!"] = false;

Кроме этого, я полагаю, это просто вопрос вкуса. IMHO, точечное обозначение короче и делает более очевидным, что это свойство, а не элемент массива (хотя, конечно, JavaScript не имеет ассоциативных массивов).

33
задан Andrew Vit 12 February 2009 в 22:44
поделиться

3 ответа

С 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 }
}
53
ответ дан knut 28 August 2018 в 06:08
поделиться
  • 1
    Есть ли способ сделать это с CSV-файлами, используя CSV-библиотеку, встроенную в ruby? Я пробовал передать :encoding => "r:bom|utf-8" в CSV foreach, но он все еще читает спецификацию, как если бы она была частью первого столбца заголовка. – Aaron 9 October 2012 в 14:30
  • 2
    Я думаю, что это возможно. С помощью CVS.read(filename, :encoding => 'utf-8') вы можете установить кодировку с помощью CSV (или это CSV.load?). Я думаю, что это тоже возможно с помощью bom-logic: :encoding => 'bom|utf-8'). Я не могу проверить это на самом деле - извините. – knut 11 October 2012 в 15:45
  • 3
    Для меня работали следующие: file = 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:37
  • 4
    Вы также можете использовать block.version File # open: File.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:34
  • 5
    Почему не только text_without_bom = File.read('file.txt', mode: 'r:bom|utf-8') – Matt Huggins 30 November 2015 в 23:26

Я бы не слепо пропустил первые три байта; что, если продюсер останавливает , добавив снова спецификацию? Что вам нужно сделать, это проверить первые несколько байтов, а если они 0xEF 0xBB 0xBF, игнорировать их. Это форма, в которой используется символ спецификации (U + FEFF) в UTF-8; Я предпочитаю иметь дело с ним, прежде чем пытаться декодировать поток, потому что обработка спецификации настолько несовместима с одним языком / инструментом / структурой до следующего.

На самом деле, так вы предположили , чтобы иметь дело с спецификацией. Если файл был подан как UTF-16, перед началом декодирования вам нужно проверить первые два байта, чтобы вы знали, следует ли считать его как big-endian или little-endian. Конечно, спецификация UTF-8 не имеет никакого отношения к порядку байта, это просто означает, что вы знаете, что кодировка UTF-8, если вы этого еще не знали.

10
ответ дан Alan Moore 28 August 2018 в 06:08
поделиться

Я не буду «доверять» некоторому файлу, который будет закодирован как 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 говорит правду.

0
ответ дан brighty 28 August 2018 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: