2016-11-24 110 views
0

我有蟒蛇以下RESTful客戶端:阿拉伯語編碼錯誤

import requests; 
s= 'وإليك ما يقوله إثنان من هؤلاء'; 
resp = requests.post('http://localhost:8080/MyApp/webresources/production/sendSentence', json={'sentence': s,}) 

的aforementionned代碼調用Java中實現的web服務,返回從請求客戶端發送相同的句子。

這是Java Web服務:

@POST 
@Consumes("application/json") 
@Produces("text/html; charset=UTF-8") 
@Path("/sendSentence") 
public String sendSentence(@Context HttpServletRequest requestContext, String valentryJson) throws Exception { 
    try { 
     if (valentryJson != null) { 
      JSONObject jsonObject; 
      jsonObject = new JSONObject(valentryJson); 
      String sentence = jsonObject.getString("sentence"); 

      return sentence; 
     } 
    } catch (JSONException ex) { 
    } 
    return ""; 
} 

問題是編碼,因爲當我嘗試打印的內容是這樣的結果:

>>> resp.content 

'\xd9\x88\xd8\xa5\xd9\x84\xd9\x8a\xd9\x83 \xd9\x85\xd8\xa7 \xd9\x8a\xd9\x82\xd9\x88\xd9\x84\xd9\x87 \xd8\xa5\xd8\xab\xd9\x86\xd8\xa7\xd9\x86 \xd9\x85\xd9\x86 \xd9\x87\xd8\xa4\xd9\x84\xd8\xa7\xd8\xa1' 

或當我使用打印:

>>> print resp.content 

    ظˆط¥ظ„ظٹظƒ ظ…ط§ ظٹظ‚ظˆظ„ظ‡ ط¥ط«ظ†ط§ظ† ظ…ظ† ظ‡ط¤ظ„ط§ط، 
+1

您沒有解碼內容。據推測這是Python 2? –

+0

我試圖解碼它使用resp.content.decode('utf8')它不起作用 –

+0

是的,它是蟒蛇2.6.5 –

回答

2

您的Java webservice會生成HTML,UTF-8編碼:

@Produces("text/html; charset=UTF-8") 

,但你把原始字節返回無需解碼:

>>> resp.content 

response.content給你一個字節,而不是Unicode文本。您可以使用resp.text屬性相反,它使用Content-Type頭的charset參數來解碼你的數據:

>>> resp.text 
u'\u0648\u0625\u0644\u064a\u0643 \u0645\u0627 \u064a\u0642\u0648\u0644\u0647 \u0625\u062b\u0646\u0627\u0646 \u0645\u0646 \u0647\u0624\u0644\u0627\u0621' 
>>> print resp.text 
وإليك ما يقوله إثنان من هؤلاء 

不過要小心;如果沒有charset參數存在,但Content-Type頭表示這是一個text/...內容類型(如text/html),然後requests將遵循HTTP RFC和解碼數據作爲Latin-1的。這會默默工作,但可能不是正確的編解碼器。對於HTML數據,請改用HTML解析器,傳遞字符串並將其留給解析器以提取哪些編解碼器是正確的(HTML通常會在<meta>標記中記錄正確的編碼)。請參閱retrieve links from web page using python and BeautifulSoup