使用JSON.parse时出现意外的编码错误

时间:2014-07-19 19:11:45

标签: ruby json encoding

我的Windows机器上有一个相当大的JSON文件,它包含\xE9之类的内容。当我JSON.parse时,它可以正常工作。

但是,当我将代码推送到运行CentOS的服务器时,我总是这样:"\xE9" on US-ASCII (Encoding::InvalidByteSequenceError)

以下是两台机器上file的输出

视窗:

λ file data.json
data.json: UTF-8 Unicode English text, with very long lines, with no line terminators

CentOS的:

$ file data.json
data.json: UTF-8 Unicode English text, with very long lines, with no line terminators

以下是我尝试解析时遇到的错误:

$ ruby -rjson -e 'JSON.parse(File.read("data.json"))'
/usr/local/rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/json/common.rb:155:in `encode': "\xC3" on US-ASCII (Encoding::InvalidByteSequenceError)

可能导致此问题的原因是什么?我尝试使用iconv将文件更改为我可以使用的每种可能的编码,但似乎没有任何效果。

1 个答案:

答案 0 :(得分:8)

"\xE9"在ISO-8859-1中是é(以及各种其他ISO-8859-X编码和Windows-1250和...),当然不是UTF-8。

使用File.read,您可以encoding options为您修改编码:

File.read('data.json',
  :external_encoding => 'iso-8859-1',
  :internal_encoding => 'utf-8'
)

这将为您提供一个UTF-8编码的字符串,您可以将其传递给JSON.parse

或者你可以让JSON.parse只使用:external_encoding来处理编码,以确保字符串来自具有正确编码标记的磁盘:

JSON.parse(
  File.read('data.json',
    :external_encoding => 'iso-8859-1',
  )
)

您应该仔细查看data.json,找出为什么 file(1)认为它是UTF-8。当文件不是UTF-8或某人可能在一个文件中混合使用UTF-8和Latin-1编码字符串时,该文件可能错误地具有BOM。