我从qt小部件中获取字符串,并且我尝试将非ascii字符(例如。€)转换为十六进制unicode字符(例如.x20ac)
目前,我正在努力查看unicode字符:
currentText = self.rich_text_edit.toPlainText() # this string is the € symbol
print("unicode char is: {0}".format(unicode_text))
这为我提供了错误:
UnicodeEncodeError:' ascii'编解码器不能对字符u' \ u20ac'进行编码。位置0:序数不在范围内(128)
实际上我想要的就是20ac。
我该怎么做?
如果我这样做:
unicode_text = str(unicode_text).encode('string_escape')
print unicode_text #returns \xe2\x82\xac
它会返回3个字符,所有这些字符都错了,我会围成一圈:)
我知道这是一个相当基本的问题,但我以前从未担心过unicode。
非常感谢, 伊恩
答案 0 :(得分:4)
使用ord
和hex
:
>>> hex(ord(u"€"))
'0x20ac'
答案 1 :(得分:4)
\xe2\x82\xac
是Unicode \x20ac
的UTF-8编码。
将其想象如下,Unicode是整数和类似于ASCII的字符之间的1对1映射,除了Unicode的整数到字符映射的数量要高得多。
您的€
符号的整数值为8364
(或十六进制为\x20ac
),这个值太大,无法容纳8位值256 - 所以{ {1}}被分解为\x20ac
的3个单独字节。这是一个非常高级别的概述,但我真的建议您看看Scott Hanselman的这个出色的解释:
Why the #AskObama Tweet was Garbled on Screen.
至于你的问题,你可以简单地做
\xe2\x82\xac