2

我有一个接受 CSV 文件上传的 Rails 应用程序。在我的 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

4

1 回答 1

1

一些想法:

  1. 您确认上传文件的编码了吗?
  2. 您是否按照 Frederick Cheung 的建议在 Mac 上测试了 1.9.2-p180?
  3. 您是否尝试过在每个平台上输出 CharDet.detect 的结果以查看接收到的文件(相对于上传的文件)的编码是什么?我想知道 Linux 上的 Apache 和 Mac 上的 WEBrick 之间的某些配置是否不同?
  4. 您是否在两个平台上使用相同版本的 CharDet?它使用哪些库(例如 iconv),它们在两个平台上的版本是否相同?

我不知道 1.9.2 和 1.9.3 之间的编码行为有任何差异,但我也没有专门研究过它。这也可能是 MRI 构建的配置不同。

于 2012-06-28T16:53:09.993 回答