2016-11-24 131 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