11

在我的应用程序(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;

谢谢。

4

2 回答 2

27

您可以使用 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}

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

utf8_encoded_content = CharlockHolmes::Converter.convert contents, detection[:encoding], 'UTF-8'

这使用户不必在再次上传之前自己做。

于 2012-09-02T07:37:18.693 回答
5

对于 1.9,很明显,您只需告诉它期待 utf8,如果不是,它将引发错误:

begin
  lines = CSV.read('bad.csv', :encoding => 'utf-8')
rescue ArgumentError
  puts "My users don't listen to me!"
end
于 2012-09-02T08:16:43.250 回答