使用请求restful client时的阿拉伯语编码错误

时间:2016-11-24 13:32:10

标签: java python rest character-encoding python-2.6

我在python中有以下restful客户端:

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

上述代码调用java中实现的Web服务,返回请求客户端发送的相同句子。

这是java webservice:

@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时:

>>> print resp.content

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

1 个答案:

答案 0 :(得分:2)

您的Java Web服务生成HTML,UTF-8编码:

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

但你没有解码就返回了原始字节:

>>> resp.content

response.content为您提供字节,而不是Unicode文本。您可以使用resp.text属性,该属性使用charset标题的Content-Type参数来解码您的数据:

>>> 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参数,但内容类型标头表明这是text/...内容类型(如text/html),那么requests将遵循HTTP RFC并将数据解码为Latin-1。这将默默工作,但可能不是正确的编解码器。对于HTML数据,请使用HTML解析器,传入bytestring,然后将其留给解析器以提取哪些编解码器是正确的(HTML通常会在<meta>标记中记录正确的编码)。请参阅retrieve links from web page using python and BeautifulSoup