【发布时间】:2013-09-06 19:11:51
【问题描述】:
如何从 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");
}
【问题讨论】:
-
您将 UTF-8 数据显示为 Python 字符串文字,将其解码为 Unicode 会得到
Oslobođenja。大概 Java 可以处理 UTF-8 数据? -
@Ognjen:坚持使用
json模块以生成有效的 JSON。u'Oslobo\u0111enja'是 not JSON,这是一个 Python 字符串文字。"Oslobo\u0111enja"是. -
@Ognjen:你想做什么是?如果您在 python 中加载 JSON,那么
u'Oslobo\u0111enja'正是您想要的。那是一个有效的 Unicode 值。我假设您正在生成 JSON 以便读取一些Java 代码,并且在Java 方面遇到了困难。 -
@Ognjen:你能更新你的问题以显示代码吗?将 Unicode 值传递给
json.dumps()以生成有效的 JSON 供 Java 处理,或者使用encoding参数告诉json.dumps()如何解码字节字符串。
标签: java python string utf-8 utf8-decode