мы разрешаем пользователям импортировать данные через CSV (используя ruby 1.9.2, следовательно, он быстрее CSV).
данные пользователя, конечно, могут быть неправильно очищены.
Когда мы пытаемся отобразить данные в методе / index, мы иногда получаем ошибку «Недопустимая последовательность байтов в UTF-8», указывающую на наш erb, где мы отображаем одно из полей widget.name
Когда мы делаем импорт, мы хотим, чтобы входящие данные были ПРАВИЛЬНЫМИ ... есть ли оператор ruby, который отобразит строку в допустимую строку utf8, например, что-то вроде
goodstring = badstring.no_more_invalid_bytes
Одним из примеров «плохих» данных является char, который выглядит как дефис, но не является обычным ascii дефисом. Мы предпочли бы сопоставить символы non-utf-8 с разумным эквивалентом ascii (umlat-u будет u для примера), НО мы в порядке с простым разделением символа на.
, поскольку это при импорте большого количества данных, он должен быть быстрым встроенным оператором, надеюсь ...
Примечание: вот пример данных. Файл приходит из окон и является 8-битным ASCII. когда мы импортируем его и в нашем эрбе мы отображаем 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 независимо от типа источника, даже если мы просто удаляем non-ascii.
хотя и не так «приятно», как форсирование кодирования, это работает с небольшим расходом на наше время импорта:
d.to_s.strip.gsub (/ \ P {ASCII} /, '')
Спасибо тебе, Младен!