【问题标题】:Ruby Character Encoding Confusion When Reading Same File In Different Environments在不同环境中读取相同文件时的 Ruby 字符编码混乱
【发布时间】:2012-06-27 05:09:25
【问题描述】:

我有一个接受 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

【问题讨论】:

  • 您是否尝试过运行相同的 ruby​​ 版本(这通常是个好主意)。

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


【解决方案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 构建的配置不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2012-09-02
    • 2019-11-27
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多