使用UTF-8的Python unicode字符串?

Wat*_*tts 7 python unicode

我从库中回来看起来是一个不正确的unicode字符串:

>>> title
u'Sopet\xc3\xb3n'
Run Code Online (Sandbox Code Playgroud)

现在,那两个十六进制转义符是U + 00F3 LATIN SMALL LETTER O WITH ACUTE的UTF-8编码.据我所知,Python中的unicode字符串应该具有实际字符,而不是字符的UTF-8编码,所以我认为这是不正确的,可能是库中或输入中的错误,对吧?

问题是,我如何(a)认识到我的unicode字符串中有UTF-8编码文本,以及(b)将其转换为正确的unicode字符串?

我对(a)感到困惑,因为对于原始字符串(即,两者都是他们自己的有效字符,u'\xc3\xb3'==³,但是它们不是应该存在的那些),编码方式没有任何错误.

看起来我可以通过eval()实现(b)前面的repr()输出减去前面的"u"来得到一个str然后用UTF-8解码str:

>>> eval(repr(title)[1:]).decode("utf-8")
u'Sopet\xf3n'
>>> print eval(repr(title)[1:]).decode("utf-8")
Sopetón
Run Code Online (Sandbox Code Playgroud)

但这似乎有些愚蠢.是否有官方认可的方法从unicode字符串中获取原始数据并将其视为常规字符串?

Ign*_*ams 11

a)尝试通过以下方法.

b)

>>> u'Sopet\xc3\xb3n'.encode('latin-1').decode('utf-8')
u'Sopet\xf3n'
Run Code Online (Sandbox Code Playgroud)


cyb*_*ind 8

你应该使用:

title.encode( 'raw_unicode_escape')

Python2:

print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape'))
Run Code Online (Sandbox Code Playgroud)

Python3:

print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape').decode('utf8'))
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的一天.我有一个内部有utf-8字节的unicode对象,并且必须将其解码回'normal'unicode.这解决了我:`my_str.encode('raw_unicode_escape').decode('utf-8')`.我认为这是一个更为通用的解决方案,即接受的答案,因为它不仅仅在'latin-1'范围内解码字符串.谢谢!:) (2认同)