2014-07-19 36 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編碼文件。 –

相關問題