我正在从 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' 编解码器无法对位置 0 中的字符 u'\u20ac' 进行编码:序号不在范围内 (128)
这正是我想要的,就在那里,20ac。
我怎样才能做到这一点?
如果我这样做:
unicode_text = str(unicode_text).encode('string_escape')
print unicode_text #returns \xe2\x82\xac
它返回 3 个字符,全部错误,我在原地转圈:)
我知道这是一个相当基本的问题,但我以前从未担心过 unicode。
非常感谢, 伊恩
请您参考如下方法:
\xe2\x82\xac是Unicode\x20ac的UTF-8编码。
可以这样想,Unicode 是整数和类似于 ASCII 的字符之间的 1 对 1 映射,除了 Unicode 在整数到字符映射的数量上要高得多。
您的 € 符号的整数值为 8364(或十六进制的 \x20ac),它太大而无法放入256 的 8 位值 - 因此 \x20ac 被分解为 3 个单独的字节 \xe2\x82\xac。这是一个非常高层次的概述,但我真的建议您看一下 Scott Hanselman 的精彩解释:
Why the #AskObama Tweet was Garbled on Screen.
至于你的问题,你可以简单的做
>>> print "unicode code point is: {0}".format(hex(ord(unicode_text)))
unicode code point is: 0x20ac
