python - unicode解码的问题

标签 python encoding utf-8 iso-8859-1 latin1

这很有趣.. 我正在尝试从 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

Zürich 的查询在 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 格式返回 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 以某种方式搞砸了。

最佳答案

When I go and print the response, the u with umlaut is encoded latin1 (0xFC)

您只是误解了输出。它是一个 unicode 字符串(您可以通过前缀中的 u 来判断),没有“附加”编码 -\xFC 意味着它是编号为 0xFC 的代码点,恰好是 U-Umlaut(请参阅 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

关于python - unicode解码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4805267/

相关文章:

python - Unicode解码错误: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)

python - 读取 XML 头编码

php - Php中的字符编码错误

Python 正则表达式匹配因 UTF-8 字符而失败

python - 在Python中,如果以元组中的值开头,我还需要返回哪个值

python - Tkinter 窗口关闭后有什么办法可以做一些事情吗?

PHP 5.3、Suhosin 和 UTF-8

java - JAXB错误: Invalid byte 1 of 1-byte UTF-8 sequence的解释

python - 几种列表推导式 - 一个接一个

python - API 访问失败期间引发的适当异常