2013-04-09 88 views
1

我正在關注Unicode - How to get the characters right?的帖子。org.json中的JSONObject lib:utf-8編碼問題

我唯一的問題是與JSONObject編碼(我使用org.json庫)。

當我把一個像àòùè쀀這樣的字符串放在JSONObject中時,就會出現這個問題。

System.out.println(entry.getValue()); 
JSONObject temp = new JSONObject(); 
temp.put("values", entry.getValue(); 
System.out.println(temp.toString()); 

我獲得àòùè쀀{"values":"àòùèì\u20ac\u20ac"}而不是{"values":"àòùè쀀"}

EDIT

通過從散列表到一個JSONObject傳遞,則使用擴展UTF-8編碼。例如,哈希表

{€èòàùì€ù=èòàù€ì, €òàèùì€=èòàù€ìç§$} 

成爲JSONObject的

{"\u20acòàèùì\u20ac":"èòàù\u20acìç§$","\u20acèòàùì\u20acù":"èòàù\u20acì"} 

回答

2

他們是完全相等,都符合Unicode逃逸採取更多的空間。像在Java中編寫\u004a與編寫a完全一樣。如果正確性是你關心的,那沒關係。

而且它不會佔用大量的額外空間或者除非大部分的文字是爲0x2000之間 - 0x20FF:

The following code逃脫C0和C1控制字符,但它也逃脫爲0x2000 - 0x20FF:

 if (c < ' ' || (c >= '\u0080' && c < '\u00a0') 
        || (c >= '\u2000' && c < '\u2100')) { 

因此,0x2000 - 0x20FF和控制字符之間的任何字符都表示爲unicode轉義字符。這對於控制字符是有意義的,因爲這些字符在它們的非轉義形式中是不允許的。

至於0x2000 - 0x20FF,我不知道,因爲代碼沒有評論。在該範圍內未轉義的每個角色都是有效的JSON。 Of course, 0x2028 and 0x2029 are not valid in Javascript(所以這個小細節使得JSON語法不是Javascript語法的一個子集),所以最好在JSON中轉義它們,以防它被用作JSONP,這真的是Javascript。但是我不明白爲什麼代碼會跳出整個範圍,因爲範圍中只有2個字符是非法的。

+0

謝謝。問題是,在一個使用pageencoding utf-8和content-type utf-8的jsp頁面中,如果我打印「àòùèì\ u20ac \ u20ac',我可以看到'àòùèì\ u20ac \ u20ac'而不是'àòùè쀀'。 – Sefran2 2013-04-09 10:10:48

+0

@Cricket是的,但是當你解碼JSON的時候,你會在解碼的對象中得到'€€'。除了數據傳輸/存儲之外,編碼的JSON不會用於數據傳輸/存儲,因此在使用JSON之前,您始終會對其進行解碼,因爲將JSON作爲字符串進行操作是沒有意義的。 – Esailija 2013-04-09 10:11:12

+0

你的解碼是什麼意思?我用'rs.getString(「json」)'從db獲取字符串,然後使用Java String解析它。我該怎麼辦? – Sefran2 2013-04-09 10:18:22