Использование fastcsv Ruby с кодировками символов

Используя Ruby 1.8.7, я хочу принимать csv в свою систему, хотя это приложение администратора, кажется, я могу получить несколько разных типов csv. На моем Mac, если я экспортирую из Excel с помощью опции «Windows csv», то fastcsv может прочитать его по умолчанию. В Windows я, кажется, получаю CSV-файлы в кодировке utf-16 (которые я еще не понял, как анализировать)

Кажется, что это довольно распространенная вещь, позволяющая пользователям загружать csv, которые могут быть в форматах utf8, utf16, ascii и т. д., обнаруживать и анализировать их. Кто-нибудь понял это?

Я начал смотреть на UniversalDetector, чтобы помочь мне обнаружить, а затем использовать Iconv для преобразования, но это кажется сложным, и я надеялся, что кто-то понял это :)


person Joelio    schedule 01.03.2011    source источник
comment
Версия Ruby очень важна в вопросах кодирования. Я предполагаю, что вы используете 1.8.x, потому что fastcsv теперь включен в ядро ​​для 1.9.x.   -  person Michael Papile    schedule 01.03.2011
comment
да, любопытно, есть ли ответ и в 1.9.x.   -  person Joelio    schedule 01.03.2011


Ответы (1)


Согласно документам FasterCSV, метод initialize принимает параметр :encoding:

Кодировка, используемая при анализе файла. По умолчанию используется ваша настройка $KDOCE. Допустимые значения: n??? orN??? ни для кого, e??? orE??? для EUC, s??? orS??? для SJIS и u??? orU??? для UTF-8 (см. Regexp.new()).

Поскольку его список ограничен, вы можете использовать iconv для выполнения предварительно обработайте содержимое, а затем передайте его в CSV. Вы можете использовать интерфейс Ruby для iconv ("Iconv") или его версию для командной строки. Iconv очень мощная и гибкая программа, способная, среди прочего, преобразовывать UTF-16.

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

Ruby 1.9.2 гораздо более эффективен, чем 1.8.7, когда дело доходит до работы с различными наборами символов, поэтому вы можете подумать об обновлении. Кроме того, чтобы лучше ознакомиться с инструментами и проблемами работы с наборами символов и многобайтовыми символами, вы должны прочитать Джеймса Грея. блоги.

person the Tin Man    schedule 02.03.2011
comment
Привет, спасибо, но я думаю, что вы повторяете мой вопрос по большей части здесь с более подробной информацией, мой вопрос есть ли какая-либо структура, плагин, драгоценный камень, оболочка и т. д., которые имеют дело с этим, кажется, что довольно часто хочется создать приложение, которое позволяет пользователям прикреплять файлы csv различных форматов... - person Joelio; 02.03.2011
comment
Я не знаю никого, кто мог бы это сделать, по крайней мере, пару лет назад, когда я рассматривал такую ​​​​же проблему, их не было. iconv может сообщить вам, что, по его мнению, является кодировкой. Вы можете попросить его проверить наиболее вероятных подозреваемых и выбрать тот, который наберет наивысший процент, но он по-прежнему подвержен ошибкам и его легко обмануть, если вы еще не знаете. CSV — это примитивный формат, который плохо соответствует спецификации, поэтому обычно владелец приложения указывает, какие кодировки поддерживаются, вместо того, чтобы действовать как уловка для всего, что кто-то бросает в него, основываясь на своей прихоти дня. - person the Tin Man; 03.03.2011