мы разрешаем пользователям импортировать данные через 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}/, '') Спасибо, Младен!