无法使用 JRuby & 正确将 CSV(中文 UTF-8)文件导入数据库“CSV”

发布于 2024-12-10 20:06:32 字数 791 浏览 0 评论 0原文

使用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 以来的一部分(它曾经是一个名为 fastCSV 的外部库),因为我可以在读取文件后将文件输出到控制台。

我还尝试在代码段的顶部插入 #encoding:utf-8 。

Using jruby 1.6.4 (ruby-1.9.2-p136)

The CSV file has UTF-8 encoding.
Contents shown normally with TextMate.

Trying this but all I get is garbled text inserted into DB.

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

Some irb info:

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

These work:

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

With the same settings, I managed to insert Turkish characters into DB. So, the problem is not like a Ruby to DB writing issue.

I suspect that the problem is with the CSV library, which is a part of Ruby since v1.9.2 (It used to be an external lib called fasterCSV) because I can output to file to console after I read the file.

I also tried inserting #encoding:utf-8 at the top of the code piece.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

农村范ル 2024-12-17 20:06:32

当 CSV 包含 unicode 字符时,“CSV.foreach”(Jruby 1.6.4 和 1.6.5)中存在 unicode 编码问题。作为解决方法,您可以使用“CSV.open”而不是“CSV.foreach”。

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

这个 bug 已被报告并且似乎在 Jruby 1.7 中得到了解决
http://jira.codehaus.org/browse/JRUBY-6266

There is a unicode encoding problem in "CSV.foreach" (Jruby 1.6.4 and 1.6.5) when CSV contains unicode characters. As a workaround you can use "CSV.open" rather than "CSV.foreach".

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

This bug is reported and seems to be solved in Jruby 1.7
http://jira.codehaus.org/browse/JRUBY-6266

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文