在写这篇文章的过程中,我得到了这个。无论如何它都是有用的,或者解决方案不是最佳的。
我有一个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/Espa\xc3\xb1ol'
。
答案 0 :(得分:0)
字符串是不必要的unicode,所以首先转换为字节串表示,然后解码为unicode,如下所示:
urllib.unquote(str(u'http://en.wikipedia.org/wiki/Espa%C3%B1ol')).decode('utf8')
答案 1 :(得分:0)
问题是%C3%B1
的含义取决于字符串的编码。
作为Unicode,它意味着ñ
。作为Latin-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')
但最好不要让框架手工编码解码但仍然是引用编码的字符串。