Подтвердить что ты не робот

Когда мы импортируем данные csv, как устранить "недопустимую последовательность байтов в UTF-8",

мы разрешаем пользователям импортировать данные через csv (используя ruby ​​1.9.2, следовательно, fastcsv).

является пользовательскими данными, конечно, это может быть неправильно обработано.

Когда мы пытаемся отобразить данные в методе /index, мы иногда получаем ошибку "неправильная последовательность байтов в UTF-8", указывающая на наш erb, где мы отображаем одно из полей widget.name

Когда мы делаем импорт, мы хотели бы, чтобы входящие данные были действительными... есть ли оператор ruby, который будет отображать строку в действительную строку utf8, например, что-то вроде

goodstring = badstring.no_more_invalid_bytes

Одним из примеров "плохих" данных является char, который выглядит как дефис, но не является обычным ascii-дефисом. Мы предпочли бы сопоставить символы non-utf-8 с разумным эквивалентом ascii (umlat-u идем к u для exmaple), НО мы в порядке, просто лишая символ.

так как это при импорте большого количества данных, он должен быть быстрым встроенным оператором, надеюсь...


Примечание: здесь приведен пример данных. Файл имеет форму windows и имеет 8 бит ascii. когда мы импортируем его и в нашем erb мы показываем widget.name.inspect(вместо widget.name), получаем: "Цепочки\x96 Аксессуары"

поэтому одним из примеров данных является "дефис", который фактически является 8-битным кодом 96.

--- когда мы изменили наш синтаксический анализ csv, чтобы назначить fldval = d.encode('UTF-8') он выдает эту ошибку:

Encoding::UndefinedConversionError in StoresController#importfinderitems
"\x96" from ASCII-8BIT to UTF-8

то, что мы ищем, - это простой способ просто заставить его быть действительным utf8 независимо от типа источника, даже если мы просто разделим не-ascii.


в то время как не "хороший", как форсирование кодировки, это работает с небольшим расходом на наше время импорта: d.to_s.strip.gsub(/\ P {ASCII}/, '') Спасибо, Младен!

4b9b3361

Ответ 1

Ruby 1.9 CSV имеет новый парсер, который работает с m17n. Парсер работает с кодировкой объекта IO в строке. Следующие методы: ::foreach, ::open, ::read, and ::readlines может принимать необязательные опции :encoding, которые вы могли бы указать в кодировке.

Например:

CSV.read('/path/to/file', :encoding => 'windows-1251:utf-8')

Преобразует все строки в UTF-8.

Также вы можете использовать более стандартное имя кодировки 'ISO-8859-1'

CSV.read('/..', {:headers => true, :col_sep => ';', :encoding => 'ISO-8859-1'})

Ответ 2

Я ответил на аналогичный вопрос, касающийся чтения внешних файлов в 1.9.2 с кодировками, отличными от UTF-8. Я думаю, что этот ответ вам очень поможет: Проблема кодировки символов в Rails v3/Ruby 1.9.2

Обратите внимание, что вам нужно знать исходную кодировку, чтобы вы могли сделать что-либо надежно. Есть библиотеки, подобные тем, с которыми я связан в другом ответе, которые могут помочь вам определить это.

Кроме того, если вы не загружаете данные из файла, вы можете легко конвертировать кодировку строки в 1.9.2:

'string'.encode('UTF-8')

Однако редко бывает, что вы создаете строку в другой кодировке, и лучше всего конвертировать ее в момент ее чтения в вашу среду, если это возможно.

Ответ 3

Ruby 1.9 может изменять строковое кодирование с недействительным обнаружением и заменой:

str = str.encode('UTF-8', :invalid => :replace)

Для необычных строк, таких как строки, загруженные из файла неизвестной кодировки, целесообразно использовать #encode вместо регулярного выражения, #gsub или #delete, потому что для этого все требуется строка, подлежащая анализу, но если строка, он не может быть проанализирован, поэтому эти методы не работают.

Если вы получите сообщение вроде этого:

error ** from ASCII-8BIT to UTF-8

Затем вы, вероятно, пытаетесь преобразовать двоичную строку, которая уже находится в UTF-8, и вы можете заставить UTF-8:

str.force_encoding('UTF-8')

Если вы знаете, что исходная строка не находится в двоичном UTF-8, или если строка вывода имеет символы-символы, то читайте на транслитерах кодирования Ruby.

Ответ 4

CSV.parse(File.read('/path/to/csv').scrub)

Ответ 5

Если вы используете Rails, вы можете попробовать исправить его со следующими

'Your string with strange stuff #@~'.mb_chars.tidy_bytes

Он удаляет недействительные символы utf-8 и заменяет его допустимыми. Дополнительная информация: https://apidock.com/rails/String/mb_chars

Ответ 6

Загрузите файл CSV в электронную таблицу Документов Google и повторно загрузите его как файл CSV. Импорт и вуаля! (Работал в моем случае)

Предположительно, Google конвертирует его в желаемый формат.

Источник: Excel в CSV с кодировкой UTF-8

Ответ 7

Только это

anyobject.to_csv(:encoding => 'utf-8')