获取字符串的Unicode字符

1 投票
2 回答
624 浏览
提问于 2025-04-18 10:46

我从一个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

使用 ordhex

>>> 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 的这篇很棒的解释:

为什么 #AskObama 的推文在屏幕上显示混乱。

至于你的问题,你可以简单地这样做:

>>> print "unicode code point is: {0}".format(hex(ord(unicode_text)))
unicode code point is: 0x20ac

撰写回答