2014-09-26 17 views
0

我有一個url像下面無法從URL UTF-8編碼的JSON響應,在Android應用程序

{ 
"data": [ 
    { 
     "fav": "", 
     "name": "u0637u0627u062cu0646 u0627u0644u062fu062cu0627u062c u0627u0644u0633u0648u064au0633u0631u064a u0627u0644u062bu0627u0646u064a", 
     "imageurl": "http://images.media.com/userphotos/250x250/26847.jpg", 
     "description": "u0633u062eu0646 u0627u0644u0641u0631u0646 <BR> u0625u0644u0649 350 u062fu0631u062cu0629 u0641u0647u0631u0646u0647u0627u064au062a (175 u062fu0631u062cu0629 u0645u0626u0648u064au0629) . <BR> u062au0631u062au064au0628 u0627u0644u062fu062cu0627u062c u0641u064a u0645u062fu0647u0648u0646 12 u00d7 8 u00d7 2 u0635u062du0646 u0627u0644u062eu0628u0632 . ", 
     "details": "<BR> 6 u062cu0644u062f u060c u0627u0644u062bu062fu064a u0627u0644u062fu062cu0627u062c u0627u0644u062eu0627u0644u064au0629 u0645u0646 u0627u0644u0639u0638u0645 <BR> 6 u0634u0631u0627u0626u062d u0627u0644u062cu0628u0646 u0627u0644u0633u0648u064au0633u0631u064a <BR> 1 (10.75 u0623u0648u0646u0635u0629) u064au0645u0643u0646 u0643u0631u064au0645 u0645u0643u062bu0641 u0645u0646 u062du0633u0627u0621 u0627u0644u062fu062cu0627u062c <BR> 1/4 u0643u0648u0628 u062du0644u064au0628 u0627u0644u0635u0641u062du0629 2 u0643u0648u0628 u0645u0632u064au062c u062du0634u0648 - u0645u062du0646u0643 u0639u0634u0628u0629 <u0631 ", 
     "tduration": "1 HR" 
    } 
] 
} 

在此的名稱,描述和細節場JSON響應包含一些語言的翻譯內容。 我需要在我的android應用程序中將其編碼爲UTF-8。 我已經使用了下面的代碼,但這似乎不工作。

reader = new BufferedReader(new InputStreamReader(stream,"UTF-8")); 

有人有想法嗎?

注:代碼工作正常,但字符不編碼。

+0

你有**「[」**但是沒有**「]」**在你的json上。 – 2014-09-26 13:49:28

+0

@BatuhanC對不起,我的打字問題。請檢查編輯的問題。 – 2014-09-26 13:52:02

+0

很多'\'似乎從您的內容中缺失。 – njzk2 2014-09-26 13:52:05

回答

0

你需要從輸入流創建一個json對象。

StringBuilder jsonResults = new StringBuilder(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(
        response.getEntity().getContent())); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       jsonResults.append(line); 
      } 
      rd.close(); 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 

      boolean result = jsonObj.getBoolean("someDummyKey"); 

還有上gitub至極一個偉大的圖書館https://github.com/loopj/android-async-http會做所有的魔法爲您服務。一探究竟。

0

首先,你的文本應該包含像\u0637\u0627\u062c\u0646(注意\)序列。

這種表示法被稱爲Unicode轉義語法。請參閱http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html

在字符串文字(如String a = "\u0060";)中使用時,由編譯器解釋,字符串a僅包含1個字符。

在JSON字符串中使用時,它由JSON解析器解碼。在你的情況下,一旦轉義序列正確固定,你可以簡單地做:

StringBuffer sb = new StringBuffer(); 
String line = null; 
while ((line = reader.readLine() != null) { 
    sb.append(line).append(System.getProperty("line.separator")); 
} 
JSONObject object = new JSONObject(sb.toString()); 

在即使你是無法修復的錯誤的服務器端的情況下,轉義序列(例如你是不是有固定的位置),你可能考慮做這樣的事情:

JSONObject object = new JSONObject(sb.toString().replace("u06", "\\u06")); 

由於您的所有問題的序列似乎是在06 unicode的平面(這是有道理的,它是在阿拉伯語字符是:http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF

+0

作爲結論,這個問題看起來在服務器端,因爲其他序列正確地逃脫了,例如, '\ u003cBR \ u003e'這是'
' – njzk2 2014-09-26 14:13:26

+0

如果你想顯示它們,用這些字節創建一個字符串,使用uft-8編碼。像'String arabic = new String(unicodeString。getBytes(「UTF-8」),「UTF-8」);' – 2014-09-26 14:15:19

+0

@PedroOliveira:你的代碼提取所做的唯一事情就是確保字符串*中的所有字符都可以用UTF-8編碼。這可能是這樣的,因爲它來自這個新的InputStreamReader(流,「UTF-8」)' – njzk2 2014-09-26 14:17:11