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

#csv #utf-8 #jruby #cjk

#csv #utf-8 #jruby #cjk

Вопрос:

Использование 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 в DB.

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

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

Ответ №1:

Существует проблема с кодировкой unicode в «CSV.foreach» (Jruby 1.6.4 и 1.6.5), когда CSV содержит символы Юникода. В качестве обходного пути вы можете использовать «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