Я использую ruby 1.9.2
Я пытаюсь проанализировать файл CSV , который содержит некоторые французские слова (например, spécifié), и поместить содержимое в базу данных MySQL.
Когда я читаю строки из файла CSV,
file_contents = CSV.read("csvfile.csv", col_sep: "$")
Элементы возвращаются в виде строк, которые ASCII-8BIT закодированы (spécifié становится sp \ xE9cifi \ xE9), и строки типа "spécifié" не будут должным образом сохранены в моей базе данных MySQL.
Иегуда Кац говорит, что ASCII-8BIT - это действительно "двоичные" данные, что означает, что CSV не знает, как читать соответствующую кодировку.
Итак, если я попытаюсь заставить CSV форсировать кодировку так:
file_contents = CSV.read("csvfile.csv", col_sep: "$", encoding: "UTF-8")
Я получаю следующую ошибку
ArgumentError: invalid byte sequence in UTF-8:
Если я вернусь к своим исходным строкам в кодировке ASCII-8BIT и изучу строку, которую мой CSV читает как ASCII-8BIT, она выглядит как «Non sp \ xE9cifi \ xE9» вместо «Non spécifié».
Я не могу преобразовать "Non sp \ xE9cifi \ xE9" в "Non spécifié", выполнив это
"Non sp\xE9cifi\xE9".encode("UTF-8")
потому что я получаю эту ошибку:
Encoding::UndefinedConversionError: "\xE9" from ASCII-8BIT to UTF-8
,
, который указал Кац, произойдет, потому что ASCII-8BIT на самом деле не является надлежащей строковой "кодировкой".
Вопросы:
- Могу ли я получить CSV для чтения моего файла в соответствующей кодировке? Если да, то как?
- Как преобразовать строку ASCII-8BIT в UTF-8 для правильного хранения в MySQL?