我的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将文件更改为我可以使用的每种可能的编码,但似乎没有任何效果。
答案 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。