Python Unicode 字符串与 UTF-8?
我从一个库里得到了一个看起来不太对的unicode字符串:
>>> title
u'Sopet\xc3\xb3n'
这里面有两个十六进制转义字符,它们是U+00F3(带重音的拉丁小写字母o)的UTF-8编码。根据我的理解,Python中的unicode字符串应该包含实际的字符,而不是字符的UTF-8编码,所以我觉得这不对,可能是库里的bug或者我的输入有问题,对吧?
我的问题是,如何 (a) 识别我的unicode字符串中有UTF-8编码的文本,以及 (b) 如何把它转换成正确的unicode字符串?
对于(a),我有点困惑,因为原始字符串在编码上没有问题(也就是说,这两个字符本身都是有效的,u'\xc3\xb3'
等于 ó,但它们不是应该在那里的东西)
看起来我可以通过对那个repr()输出使用eval(),去掉前面的“u”,得到一个字符串,然后用UTF-8解码这个字符串来实现(b):
>>> eval(repr(title)[1:]).decode("utf-8")
u'Sopet\xf3n'
>>> print eval(repr(title)[1:]).decode("utf-8")
Sopetón
但这似乎有点笨拙。有没有什么官方认可的方法可以从unicode字符串中提取原始数据,并把它当作普通字符串处理呢?
2 个回答
8
你应该使用:
>>> title.encode('raw_unicode_escape')
Python2:
print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape'))
Python3:
print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape').decode('utf8'))
11
a) 尝试用下面的方法来处理它。
b)
>>> u'Sopet\xc3\xb3n'.encode('latin-1').decode('utf-8')
u'Sopet\xf3n'