在写这篇文章的过程中,我让它发挥了作用。无论如何,它都在这里,以防它有用或解决方案不太理想。
我有一个unicode字符串u'http://en.wikipedia.org/wiki/Espa%C3%B1ol'
,我想从中得到u'http://en.wikipedia.org/wiki/Español'
。我尝试使用urllib.unquote得到了u'http://en.wikipedia.org/wiki/Espaxc3xb1ol'
。
问题在于%C3%B1
的含义取决于字符串的编码。
作为Unicode,它的意思是ñ
。作为拉丁语-1,它也意味着ñ
。作为UTF-8,它意味着ñ
。
因此,在从UTF-8进行解码之前,您需要取消对这些字符的捕获。
换句话说,在某个地方,你正在做相当于:
u = urllib.unquote(s.decode('utf-8'))
不要那样做。你应该做:
u = urllib.unquote(s).decode('utf-8')
如果您使用的某个框架在看到字符串之前已经对其进行了解码,请重新编码、取消引用并重新解码:
u = urllib.unquote(u.encode('utf-8')).decode('utf-8')
但最好不要对框架进行字符集解码,而是首先引用编码字符串。
字符串是不必要的unicode,因此首先转换为字节字符串表示,然后解码为unicode,如下所示:
urllib.unquote(str(u'http://en.wikipedia.org/wiki/Espa%C3%B1ol')).decode('utf8')