这很有趣.. 我正在尝试从OpenStreetMap中读取地理位置查找数据。执行查询的代码看起来像这样
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
当我打印响应时,带有umlaut的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的格式返回JSON数据。
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时都使用UTF-8。
这里发生了什么?
编辑:显然是json.loads出了问题。
00FC
是ü
的Unicode代码点。当您将其编码为UTF-8时,它将更改为b"\xc3\xbc"
,但仅在那时。\xfc
与\u00fc
相同。 - Tim Pietzckerb\x00\xFC
吗?难道一个字节的\xfc
是 Latin-1 的表示吗?如果这是个愚蠢的问题,请原谅我,因为我对 Python 一无所知,只是好奇。 - Pekka