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

itd*_*ork 2 ruby encoding json

我的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
Run Code Online (Sandbox Code Playgroud)

CentOS的:

$ file data.json
data.json: UTF-8 Unicode English text, with very long lines, with no line terminators
Run Code Online (Sandbox Code Playgroud)

这是我在尝试解析它时遇到的错误:

$ 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)
Run Code Online (Sandbox Code Playgroud)

什么可能导致这个问题?我已经尝试使用iconv将文件更改为我可以使用的每种可能的编码,但似乎没有任何工作.

mu *_*ort 8

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

您可以File.read使用编码选项为您修复编码:

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

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

或者您可以JSON.parse通过使用:external_encoding以确保字符串来自具有正确编码标志的磁盘来处理编码:

JSON.parse(
  File.read('data.json',
    :external_encoding => 'iso-8859-1',
  )
)
Run Code Online (Sandbox Code Playgroud)

你应该仔细看data.json弄清楚为什么文件(1)认为这是UTF-8.当文件不是UTF-8或某人可能在一个文件中混合使用UTF-8和Latin-1编码的字符串时,该文件可能错误地具有BOM.