#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