将 multichar %xx 转义符转换为 unicode

Convert multichar %xx escapes to unicode

在写这篇文章的过程中,我开始使用它。无论如何,如果它有用或解决方案不是最佳的,它就在这里。

我有一个 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'.

该字符串不必要是 unicode,所以先转换为字节字符串表示,然后解码为 un​​icode,如下所示:

urllib.unquote(str(u'http://en.wikipedia.org/wiki/Espa%C3%B1ol')).decode('utf8')

问题是%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')

但是最好不要让框架手给你进行字符集解码,但首先仍然是引号编码的字符串。