在不同环境中读取相同文件时的Ruby字符编码混淆

时间:2012-06-27 05:09:25

标签: ruby-on-rails ruby character-encoding

我有一个Rails应用程序,可以接受CSV文件的文件上传。在我的Mac上本地开发功能时,我在尝试解析上传的文件时(使用Ruby的标准库CSV)收到“UTF-8中的无效字节序列”错误。

所以在做了一些研究并在StackOverflow上阅读类似问题的答案之后,我尝试使用gem来嗅出字符编码(即CharDet),然后当通过CSV库打开文件时,我会指定编码。这解决了我所有的问题,生活也很美好。

    content = File.read(fullpath)
    self.file_encoding = CharDet.detect(content)['encoding']
    CSV.table(fullpath, :encoding => file_encoding, :header_converters => :downcase).headers

然后我将此代码部署到生产Linux环境,并再次使用“UTF-8中的无效字节序列”错误。多么神秘(对我来说)!经过一段时间尝试解决错误后,我尝试在打开文件时删除指定编码的代码。并奇迹般地解决了生产问题,但现在Mac的本地化发展已经破裂。

请记住,在这两种情况下,我都使用相同的浏览器上传相同的文件。有没有人对这里发生的事情有任何见解?

顺便说一句,ruby的版本很接近,但不一样。 Mac ruby​​ 1.9.3-p0 ,Linux服务器 1.9.2-p180 。该应用程序是Rails 3.2.6

1 个答案:

答案 0 :(得分:1)

一些想法:

  1. 您确认要上传的文件的编码吗?
  2. 您是否在Mac上测试了1.9.2-p180,正如Frederick Cheung所说?
  3. 您是否尝试在每个平台上输出CharDet.detect的结果,以查看接收文件的编码(与上传的文件相对)是什么?我想知道Linux上的Apache和Mac上的WEBrick之间的配置有什么不同吗?
  4. 您是否在两个平台上使用相同版本的CharDet?它使用了哪些库(例如iconv),它们在两个平台上是否都是相同的版本?
  5. 我不知道1.9.2和1.9.3之间在编码方面的行为有任何差异,但我也没有专门研究它。它也可能是MRI构建配置的差异。