6

如何从 Python 创建的字符串 'Oslobo\xc4\x91enja' 中获取正确的 Java 字符串?如何解码?我已经尝试了我认为的一切,到处寻找,我已经被这个问题困住了 2 天。请帮忙!

这是 Python 的 Web 服务方法,它返回 JSON,带有 Google Gson 的 Java 客户端会解析它。

def list_of_suggestions(entry):
   input = entry.encode('utf-8')
   """Returns list of suggestions from auto-complete search"""
   json_result = { 'suggestions': [] }
   resp = urllib2.urlopen('https://maps.googleapis.com/maps/api/place/autocomplete/json?input=' + urllib2.quote(input) + '&location=45.268605,19.852924&radius=3000&components=country:rs&sensor=false&key=blahblahblahblah')
   # make json object from response
   json_resp = json.loads(resp.read())

   if json_resp['status'] == u'OK':
     for pred in json_resp['predictions']:
        if pred['description'].find('Novi Sad') != -1 or pred['description'].find(u'Нови Сад') != -1:
           obj = {}
           obj['name'] = pred['description'].encode('utf-8').encode('string-escape')
           obj['reference'] = pred['reference'].encode('utf-8').encode('string-escape')
           json_result['suggestions'].append(obj)

   return str(json_result)

这是Java客户端上的解决方案

private String python2JavaStr(String pythonStr) throws UnsupportedEncodingException {
    int charValue;
    byte[] bytes = pythonStr.getBytes();
    ByteBuffer decodedBytes = ByteBuffer.allocate(pythonStr.length());
    for (int i = 0; i < bytes.length; i++) {
        if (bytes[i] == '\\' && bytes[i + 1] == 'x') {
            // \xc4 => c4 => 196
            charValue = Integer.parseInt(pythonStr.substring(i + 2, i + 4), 16);
            decodedBytes.put((byte) charValue);
            i += 3;
        } else
            decodedBytes.put(bytes[i]);
    }
    return new String(decodedBytes.array(), "UTF-8");
}
4

2 回答 2

2

您正在返回python数据结构的字符串版本。

而是返回一个实际的 JSON 响应;值保留为 Unicode:

if json_resp['status'] == u'OK':
    for pred in json_resp['predictions']:
        desc = pred['description'] 
        if u'Novi Sad' in desc or u'Нови Сад' in desc:
            obj = {
                'name': pred['description'],
                'reference': pred['reference']
            }
            json_result['suggestions'].append(obj)

return json.dumps(json_result)

现在 Java 不必解释 Python 转义码,而是可以解析有效的 JSON。

于 2013-09-03T15:12:58.030 回答
1

Python 通过将UTF-8 字节转换为一系列 \xVV 值来转义 unicode 字符,其中 VV 是字节的十六进制值。这与 java unicode 转义非常不同,后者每个字符只有一个 \uVVVV,其中 VVVV 是十六进制 UTF-16 编码。

考虑:

\xc4\x91

在十进制中,这些十六进制值是:

196 145

然后(在Java中):

byte[] bytes = { (byte) 196, (byte) 145 };
System.out.println("result: " + new String(bytes, "UTF-8"));

印刷:

result: đ
于 2013-09-03T14:47:32.423 回答