Не удается правильно импортировать файл CSV (китайский UTF-8) в БД с помощью JRuby & "CSV"

Использование jruby 1.6.4 (ruby-1.9.2-p136)

Файл CSV имеет кодировку UTF-8. Содержимое отображается нормально с TextMate.

Пытаясь это, но все, что я получаю, это искаженный текст, вставленный в БД.

CSV.foreach(data_file_path, :headers=>false, :encoding=>"UTF-8", :col_sep=>"^") do |row|
    # parse and write to DB
end

Некоторая информация IRB:

irb(main):001:0> puts "你好"
你好
=> nil
irb(main):002:0> puts RUBY_VERSION
1.9.2
=> nil
irb(main):003:0>

Эти работы:

jruby -e 'puts "你好"'
jruby --1.9 -e 'puts "你好"'
jruby -Ku -e 'puts "你好"'

С такими же настройками мне удалось вставить турецкие символы в БД. Таким образом, проблема не похожа на проблему записи Ruby в БД.

Я подозреваю, что проблема связана с библиотекой CSV, которая является частью Ruby начиная с v1.9.2 (раньше это была внешняя библиотека, называемая fastCSV), потому что я могу выводить в файл на консоль после прочтения файла.

Я также попытался вставить #encoding:utf-8 в верхней части кода.

1 ответ

Существует проблема кодировки Unicode в "CSV.foreach" (Jruby 1.6.4 и 1.6.5), когда CSV содержит символы Unicode. В качестве обходного пути вы можете использовать "CSV.open" вместо "CSV.foreach".

reader = CSV.open(file, "r")
reader.each do |row|
    # do something 
end

Об этой ошибке сообщают, и, похоже, она решена в Jruby 1.7 http://jira.codehaus.org/browse/JRUBY-6266

Другие вопросы по тегам