unicode解码问题

问题描述:

这很有趣..我试图从openstreetmap读取地理查找数据。执行查询的代码如下所示unicode解码问题

params = urllib.urlencode({'q': ",".join([e for e in full_address]), 'format': "json", "addressdetails" : "1"}) 
query = "http://nominatim.openstreetmap.org/search?%s" % params 
print query 
time.sleep(5) 
response = json.loads(unicode(urllib.urlopen(query).read(), "UTF-8"), encoding="UTF-8") 
print response 

苏黎世的查询在UTF-8数据上正确地进行了URL编码。这里没有奇迹。

http://nominatim.openstreetmap.org/search?q=Z%C3%BCrich%2CSWITZERLAND&addressdetails=1&format=json 

当我打印响应,变音符号的u被编码LATIN1(0xFC有)

[{u'display_name': u'Z\xfcrich, Bezirk Z\xfcrich, Z\xfcrich, Schweiz, Europe', u'place_id': 588094, u'lon': 8.540443 

但是这是无义因为OpenStreetMap的以UTF-8

Connecting to nominatim.openstreetmap.org (nominatim.openstreetmap.org)|128.40.168.106|:80... connected. 
HTTP request sent, awaiting response... 
    HTTP/1.1 200 OK 
    Date: Wed, 26 Jan 2011 13:48:33 GMT 
    Server: Apache/2.2.14 (Ubuntu) 
    Content-Location: search.php 
    Vary: negotiate 
    TCN: choice 
    X-Powered-By: PHP/5.3.2-1ubuntu4.7 
    Access-Control-Allow-Origin: * 
    Content-Length: 3342 
    Keep-Alive: timeout=15, max=100 
    Connection: Keep-Alive 
    Content-Type: application/json; charset=UTF-8 
Length: 3342 (3.3K) [application/json] 

返回JSON数据这也可以通过文件内容得到证实,然后我明确地说在读取和json解析时都是UTF-8。

这是怎么回事?

编辑:显然它是json.loads以某种方式搞砸了。

当我去打印响应, U带变音符号编码LATIN1(0xFC有)

你只是误解输出。这是一个unicode字符串(你可以通过前缀u来判​​断),没有编码“附加” - \ xFC表示它的编码为0xFC,恰好是U变音(见http://www.fileformat.info/info/unicode/char/fc/index.htm)。发生这种情况的原因是前256个unicode码点的编号与latin1编码一致。

简而言之,你做的一切都是正确的 - 你有一个unicode对象和正确的内容(对编码无关),你可以选择你想要的编码,当你使用unicodestr.encode “utf-8”)或使用编解码器,请参阅http://docs.python.org/howto/unicode.html#reading-and-writing-unicode-data

+0

@etarion但它说'UTF-8(十六进制)0xC3 0xBC`在表中。它不应该在UTF-8内容中表现为这样吗?如果我没有弄错,如果我将字符串`oxFC`用作UTF-8字符串中的字符,它将是一个无效字符。 – 2011-01-26 13:57:03

输出正常。无论何时在控制台上打印数据,Python仅在打印实际字符串时才对Unicode数据进行encon。如果您打印统一码的列表,每个unicode字符串是控制台作为其再版()上显示:

>>> a=u'á' 
>>> a 
u'\xe1' 
>>> print a 
á 
>>> [a] 
[u'\xe1'] 
>>> print [a] 
[u'\xe1']