获取字符串的Unicode字符
我从一个qt控件获取了一个字符串,现在想把里面的非ASCII字符(比如€)转换成十六进制的unicode字符(比如x20ac)。
目前我用的方法是这样的:
currentText = self.rich_text_edit.toPlainText() # this string is the € symbol
print("unicode char is: {0}".format(unicode_text))
但是我遇到了这个错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)
其实我就是想要这个20ac。
我该怎么才能得到它呢?
如果我这样做:
unicode_text = str(unicode_text).encode('string_escape')
print unicode_text #returns \xe2\x82\xac
结果返回了3个字符,都是错误的,我感觉自己在原地打转 :)
我知道这个问题比较基础,但我之前从来没有考虑过unicode的问题。
非常感谢,
伊恩
2 个回答
3
使用 ord
和 hex
:
>>> hex(ord(u"€"))
'0x20ac'
3
\xe2\x82\xac
是 Unicode \x20ac
的 UTF-8 编码。
可以这样理解,Unicode 就像是一个数字和字符之间的一对一对应关系,类似于 ASCII,但 Unicode 能表示的数字和字符的组合要多得多。
你的 €
符号的整数值是 8364
(在十六进制中是 \x20ac
),这个值太大,无法放进一个 8 位的数值(最大只能是 256),所以 \x20ac
被拆分成了三个单独的字节 \xe2\x82\xac
。这只是一个很简单的概述,但我建议你看看 Scott Hanselman 的这篇很棒的解释:
至于你的问题,你可以简单地这样做:
>>> print "unicode code point is: {0}".format(hex(ord(unicode_text)))
unicode code point is: 0x20ac