Я использую 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?