将 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,所以先转换为字节字符串表示,然后解码为 unicode,如下所示:
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')
但是最好不要让框架手给你进行字符集解码,但首先仍然是引号编码的字符串。
在写这篇文章的过程中,我开始使用它。无论如何,如果它有用或解决方案不是最佳的,它就在这里。
我有一个 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,所以先转换为字节字符串表示,然后解码为 unicode,如下所示:
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')
但是最好不要让框架手给你进行字符集解码,但首先仍然是引号编码的字符串。