Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unicode解码问题_Python_Encoding_Utf 8_Iso 8859 1_Latin1 - Fatal编程技术网

Python unicode解码问题

Python unicode解码问题,python,encoding,utf-8,iso-8859-1,latin1,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) re

这很有趣。。我正在尝试从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
当我打印响应时,带有umlaut的u被编码为拉丁文1(0xFC)

但这毫无意义,因为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搞砸了

当我去打印响应时 带有umlaut的u编码为拉丁文1(0xFC)

你只是误解了输出。它是一个unicode字符串(您可以通过前缀中的u来判断),没有“附加”编码\xFC意味着它是编号为0xFC的代码点,正好是u-Umlaut(请参阅)。发生这种情况的原因是前256个unicode代码点的编号与latin1编码一致


简言之,您做的一切都是正确的-您有一个具有正确内容的unicode对象(与编码无关),您可以在某处使用该内容进行输出时选择所需的编码,方法是执行unicode.encode(“utf-8”)或使用编解码器,请参见

输出正常。每当您在控制台上打印数据时,Python仅在打印实际字符串时才会加密Unicode数据。如果打印unicode的列表,每个unicode字符串在控制台上显示为其repr():


@但表中显示的是
UTF-8(十六进制)0xC3 0xBC
。在UTF-8内容中不应该这样表示吗?如果我没有弄错的话,如果我把
oxFC
作为UTF-8字符串中的一个字符使用,它将是一个无效字符。也许你是对的。。。我如何检查是代码点还是实际数据?尝试将其解码为ascii?+1:我认为可能是这样,但我的python fu不够高,无法正确验证它。毕竟,在UTF8控制台中编写
print u'Z\xfcrich'
打印出正确的内容。@Pekka:Python不使用UTF-8表示内部字符串
00FC
u
的Unicode码点,正如@etarion所解释的。当您将其编码为UTF-8时,它将被更改为
b“\xc3\xbc”
,但只有在那时
\xfc
\u00fc
相同。它不是关于python的,而是关于unicode的。unicode字符串是一系列代码点,0xFC是U-Umlaut的代码点。它不是字节-unicode字符串没有“字节”的概念。
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]
>>> a=u'á'
>>> a
u'\xe1'
>>> print a
á
>>> [a]
[u'\xe1']
>>> print [a]
[u'\xe1']