Python的urllib.quote
和urllib.unquote
在Python 2.6.5中不能正确处理Unicode。这就是发生的情况:
In [5]: print urllib.unquote(urllib.quote(u'Cataño'))
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
/home/kkinder/<ipython console> in <module>()
/usr/lib/python2.6/urllib.pyc in quote(s, safe)
1222 safe_map[c] = (c in safe) and c or ('%%%02X' % i)
1223 _safemaps[cachekey] = safe_map
-> 1224 res = map(safe_map.__getitem__, s)
1225 return ''.join(res)
1226
KeyError: u'\xc3'
将值编码为UTF8也不起作用:
In [6]: print urllib.unquote(urllib.quote(u'Cataño'.encode('utf8')))
Cataño
它被认为是一个bug和there is a fix,但不是我的Python版本。
我想要的是类似于urllib.quote/urllib.unquote的东西,但是正确地处理unicode变量,这样这段代码就可以工作了:
decode_url(encode_url(u'Cataño')) == u'Cataño'
有什么建议吗?
我遇到了同样的问题,并使用了一个helper函数来处理非ascii和urllib.urlencode函数(包括引号和unquote):
采用自Unicode URL encode / decode with Python
urllib
根本不处理Unicode。根据定义,url不包含非ASCII字符。在处理urllib
时,应该只使用字节字符串。如果你想让这些字符代表Unicode字符,你将不得不手工编码和解码它们。IRIs可以包含非ASCII字符,将它们编码为UTF-8序列,但是Python在这一点上没有
irilib
。啊,好了,现在您在控制台中键入Unicode,并在控制台中执行
print
-Unicode。这通常是不可靠的,特别是在Windows和您的情况下with the IPython console。用反斜杠序列长距离地键入它,您可以更容易地看到
urllib
位确实起作用:“将值编码为UTF8也不起作用”。。。代码的结果是一个
str
对象,据猜测它似乎是用UTF-8编码的输入。你需要解码它或者定义“不工作”——你期望什么?注意:为了不需要猜测终端的编码和数据类型,请使用
print repr(whatever)
,而不是print whatever
。供比较:
相关问题 更多 >
编程相关推荐