2012-08-08 92 views
5

過去幾天我一直在尋找這個問題,但我不認爲我能夠找到正確的指針。如果發現重複,請將它與合適的問題合併。在Java JSON解析中出現問號的Unicode字符

我對使用JSON非常新,並且作爲我需要解碼JSON文件並對其進行進一步處理的其中一個項目的一部分。但是,當我嘗試使用Json-simple庫進行解碼時,我在解析對象中得到了一些奇怪的問號而不是實際的字符。示例代碼如下所示:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}"; 
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(str); 

System.out.println(jsonObject) gives {"alias":["Evrópa","?????"]} 

我試過使用Json-lib也得到了相同的結果。

感謝您的幫助。

+0

請參見[本問題]中的'System.out'問題的評論(http://stackoverflow.com/questions/11849624) – McDowell 2012-08-08 15:35:51

回答

6

問題不在於你的JSON,它與你的System.out.println()。這些字符不能用您的終端(或您的IDE,如果這是您運行它的地方)的字符編碼表示,也不能用您的環境中System.out使用的編碼表示。

文件不能包含Unicode字符。文件是字節的流,但Unicode 字符的大小是多個字節(通常爲兩個)。這是字符編碼變得相關的地方。 Unicode字符必須轉換爲一系列字節才能將它們寫入文件(包括System.out)。 Unicode字符最常用的編碼之一是UTF-8。軟件程序員的技巧是在字節和字符之間進行轉換時始終使用正確的字符編碼。例如,在調試println()調用中,在一個地方缺少正確的編碼會導致錯誤的和誤導性的輸出。

+0

爲了確保不會出現這種情況,我已經嘗試寫入我解析過的同一個對象,回到一個文件中,我的編輯器中以前可見的Unicode編碼現在在同一編輯器中顯示爲問號。所以我想這可能是解析或字符編碼的問題。 – 2012-08-09 01:02:06

+0

當您將文字寫入文件時,您可能沒有正確編碼字符,或者您的編輯器在讀取文件時沒有使用相同的編碼。我只是用Python快速測試了你的JSON(它比用Java測試更快)並且數據沒有問題。它看起來像字符是希伯來語,我認爲 – dsh 2012-08-09 01:31:31

+0

好吧,我剛剛用Java(OpenJDK 1.6.0,使用libjson-simple-java庫)進行了測試,它工作正常。我的環境包含LANG = en_US.UTF-8;我的GNOME終端同樣設置爲UTF-8。 – dsh 2012-08-09 01:59:18

0

您可能正在使用不支持特殊字符組的默認字符集。嘗試使用UTF-8字符集你的東西沿着這些線路:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}"; 
InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(str.getBytes(Charset.forName("UTF-8"))), Charset.forName("UTF-8")); 
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(isr); 
+1

數據已經是一個包含unicode字符的字符串。不需要將其編碼爲字節,然後將字節解碼回字符串。 – dsh 2012-08-08 16:25:01

+0

我感覺dsh說的是正確的。還研究了一些可能的原因,因爲我們的解析器將unicode編碼轉換爲其他編碼,然後在目標編碼不支持某些字符時將它們轉換爲問號。 – 2012-08-09 01:14:07