如何在Python中取消一个urlencoded unicodestring?

我有一个像“Tanım”这样的编码为“Tan%u0131m”的unicodestring。 我怎样才能将这个编码的string转换回原来的Unicode。 显然urllib.unquote不支持unicode。

%uXXXX是一个非标准的编码scheme ,被W3C拒绝,尽pipe实现继续在JavaScript的土地上生活。

更常见的技术似乎是UTF-8对string进行编码,然后使用%XX转义结果字节。 该scheme由urllib.unquote支持:

>>> urllib2.unquote("%0a") '\n' 

不幸的是,如果你确实需要支持%uXXXX,那么你可能不得不推出你自己的解码器。 否则,简单地说,UTF-8编码你的unicode,然后%转义生成的字节就更可取了。

一个更完整的例子:

 >>> u"Tanım" u'Tan\u0131m' >>> url = urllib.quote(u"Tanım".encode('utf8')) >>> urllib.unquote(url).decode('utf8') u'Tan\u0131m' 
 def unquote(text): def unicode_unquoter(match): return unichr(int(match.group(1),16)) return re.sub(r'%u([0-9a-fA-F]{4})',unicode_unquoter,text) 

如果你绝对必须这样做(我真的同意“非标准”的呼声):

 from urllib import unquote def unquote_u(source): result = unquote(source) if '%u' in result: result = result.replace('%u','\\u').decode('unicode_escape') return result print unquote_u('Tan%u0131m') > Tanım 

在上面的版本中有一个错误,当string中同时存在ascii编码和unicode编码的字符时,它有时会吓倒。 我认为,特别是除了Unicode之外,还有128字节以上的字符,如'\ xab'。

例如。 “%5B%AB%u03E1%BB%5D”导致此错误。

我发现如果你刚刚做了unicode,问题就消失了:

 def unquote_u(source): result = source if '%u' in result: result = result.replace('%u','\\u').decode('unicode_escape') result = unquote(result) return result