2015-05-12 3 views
3

Я пытаюсь импортировать CSV-файл (кодировку UTF-8) в Ruby (2.0.0) в мою базу данных (MSSQL 2008R2, COLLATION French_CI_AS), но специальные символы (французские акценты на гласных) не хранятся должным образом: éèçôü становится éèçôü (или другой подобный сплетен).Прочтите файл CSV со специальными символами в Ruby и сохраните его в SQL Server

Я использую этот кусок кода для чтения файла:

CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row| 
    # ... 
end 

Я пробовал различные кодировки в параметрах CSV (utf-8, iso-8859-1, windows-1252), но никто не будет правильно хранить специальные символы.

Прежде чем вы спросите, моя сортировка базы данных поддерживает эти символы, так как мы успешно импортировали данные, содержащие данные с использованием импортеров PHP. Если я сброшу данные с помощью puts или регистратора файлов, все будет правильно.

Что-то не так с моим кодом, или мне нужно указать что-то еще (например, для кодирования файла класса ruby)?

Благодаря

EDIT: Сохранение данных осуществляется с помощью API PHP REST, который отлично работает с диакритическими знаками. Он сохраняет данные по мере их получения.

В Ruby я просматриваю свои данные, сохраняю их в объекте и затем отправляю объект, закодированный JSON, в тело моего запроса PUT. Но если я использую запрос SQL непосредственно из Ruby, проблема остается:

query = <<-SQL 
    UPDATE MyTable SET MyTable_title = '#{row_data['title']}' WHERE MyTable_id = '#{row_data['id']}' 
SQL 
res = db.execute query 
+0

Вы сбросили данные и все было правильно, потому что вы читаете 'UTF-8' кодированный файл с' UTF-8' читателя. Проблема, очевидно, заключается в встраивании в базу данных. Не могли бы вы поделиться кодом, который вы используете, чтобы сохранить его в базе данных? Бьюсь об закладке 'str.encode ('iso-8859-1')' вместо того, чтобы просто поставить 'str', решит проблему. – mudasobwa

+0

Отредактировано мое сообщение, чтобы ответить на ваш вопрос. Добавление ручного кодирования не решает проблему, сохраненное значение все еще jibberish ... – 3rgo

+0

API не может «отлично работать с акцентированными символами», потому что для API не существует понятия «акцентированный символ». Он просто получает байтовый поток и передает его дальше в адаптер mysql. Важно, чтобы параметр mysql 'client_encoding' _must_ соответствовал реальной кодировке этого байтового потока. Таким образом, потребуется ручное кодирование. – mudasobwa

ответ

0

Я думал, что это было что-то делать с типом кодирования в файл CSV, поэтому начал копаться в этом. Я обнаружил, что кодировка Windows-1252 будет вставлять управляющие символы.

Вы можете прочитать об этом здесь: Converting special charactes such as ü and à back to their original, latin alphbet counterparts in C#