Rails 3,导入前检查CSV文件编码

ale*_*our 11 ruby csv ruby-on-rails

在我的应用程序(Rails 3.0.5,Ruby 1.8.7)中,我创建了一个导入工具来从文件导入CSV数据.

问题:我要求我的用户以UTF-8编码从Excel导出CSV文件,但他们大部分时间都不会这样做.

如何在导入前验证文件是否为UTF-8?否则导入将运行,但会产生奇怪的结果.我使用FasterCSV导入.

错误的CSV文件的例子:

;VallÈe du RhÙne;CÙte Rotie;
Run Code Online (Sandbox Code Playgroud)

谢谢.

bcd*_*bcd 24

您可以使用Charlock Holmes,一个用于Ruby的字符编码检测库.

https://github.com/brianmario/charlock_holmes

要使用它,您只需阅读该文件,然后使用该detect方法.

contents = File.read('test.xml')
detection = CharlockHolmes::EncodingDetector.detect(contents)
# => {:encoding => 'UTF-8', :confidence => 100, :type => :text}
Run Code Online (Sandbox Code Playgroud)

如果编码格式不正确,您还可以将编码转换为UTF-8:

utf8_encoded_content = CharlockHolmes::Converter.convert contents, detection[:encoding], 'UTF-8'
Run Code Online (Sandbox Code Playgroud)

这样可以避免用户在再次上传之前自行完成操作.


pgu*_*rio 6

对于1.9很明显,你只是告诉它期望utf8,如果不是,它会引发错误:

begin
  lines = CSV.read('bad.csv', :encoding => 'utf-8')
rescue ArgumentError
  puts "My users don't listen to me!"
end
Run Code Online (Sandbox Code Playgroud)

  • 大声笑!我喜欢把“我的用户不听我说!” (2认同)