Я пытаюсь импортировать 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
Вы сбросили данные и все было правильно, потому что вы читаете 'UTF-8' кодированный файл с' UTF-8' читателя. Проблема, очевидно, заключается в встраивании в базу данных. Не могли бы вы поделиться кодом, который вы используете, чтобы сохранить его в базе данных? Бьюсь об закладке 'str.encode ('iso-8859-1')' вместо того, чтобы просто поставить 'str', решит проблему. – mudasobwa
Отредактировано мое сообщение, чтобы ответить на ваш вопрос. Добавление ручного кодирования не решает проблему, сохраненное значение все еще jibberish ... – 3rgo
API не может «отлично работать с акцентированными символами», потому что для API не существует понятия «акцентированный символ». Он просто получает байтовый поток и передает его дальше в адаптер mysql. Важно, чтобы параметр mysql 'client_encoding' _must_ соответствовал реальной кодировке этого байтового потока. Таким образом, потребуется ручное кодирование. – mudasobwa