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将文件更改为我可以使用的每种可能的编码,但似乎没有任何工作.
"\xE9"是éISO-8859-1(和各种其他ISO-8859-X编码和Windows-1250和...),当然不是UTF-8.
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.