2014-07-19 38 views
2

我的Windows机器上有一个相当大的JSON文件,它包含像\xE9这样的东西。当我JSON.parse它,它工作正常。使用JSON.parse意外的编码错误

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

这里是file在两台机器上输出

的Windows:

λ 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 

这里我s我试图解析时得到的错误:

$ 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将文件转换为每种可能的编码,但似乎没有任何效果。

回答

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仔细看弄清楚为什么文件(1)认为它是UTF-8。当文件不是UTF-8或有人可能在一个文件中混合使用UTF-8和Latin-1编码的字符串时,该文件可能错误地包含BOM。

+0

事情是,我自己有问题的文件;是否有可能直接用文件的编码来解决这个问题,还是我必须从Ruby中完成?在阅读你的答案后,我尝试将文件转换为ISO-8859-1,但它仍然无法识别它。 – itdoesntwork

+0

该文件已经是ISO-8859-1。您可以将它读入Ruby,将编码转换为UTF-8(如第一个“File.read”示例中所示),然后将其写回。这会给你带来一个UTF-8编码文件。 –

相关问题