在python中从字符串生成unicode对象?

2024-10-03 00:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

test = unicode('\x03B', 'utf-16BE', 'ignore')

产生胡言乱语。我想测试是一个分号。如果我用'\x03~'替换十六进制,我得到一个分号。你知道吗

我的问题是为什么?我以为分号的unicode值是003B?你知道吗

谢谢!你知道吗


Tags: testunicodeutfignorex03x03b
2条回答

有多个字符看起来像分号。自从你 提到'\x03~'和utf-16be编码,您一定是指 希腊问号。(下面,我将'\x03~'表示为b'\x03~'以使这个答案有效 在Python2.7和Python3中。)

In [207]: b'\x03~'.decode('utf-16be')
Out[207]: u'\u037e'

In [208]: import unicodedata as UDAT

In [209]: UDAT.name(u'\u037e')
Out[209]: 'GREEK QUESTION MARK'

In [206]: u'\N{GREEK QUESTION MARK}' == u';'
Out[206]: True

In [198]: u'\N{GREEK QUESTION MARK}'.encode('utf-16be')
Out[198]: b'\x03~'

因此,用utf-16be编码的unicode U+037E(希腊问号)是b'\x03~',而不是b'\x03'。你知道吗


请注意,这与U+003B(分号)不同:

In [211]: u';'.encode('utf-16be')
Out[211]: b'\x00;'

In [212]: UDAT.name(u';')
Out[212]: 'SEMICOLON'

In [214]: hex(ord(u';'))
Out[214]: '0x3b'

In [216]: u'\u003b' == u'\N{SEMICOLON}'
Out[216]: True

In [217]: u'\N{GREEK QUESTION MARK}' == u'\N{SEMICOLON}'
Out[217]: False

您未能正确指定UTF-16编码的分号,它由两个八位字节\x00\x3B组成。正确的说法是:

test = unicode('\x00\x3B', 'utf-16BE', 'ignore')

这将产生一个Unicode分号,如预期的那样。你知道吗

相关问题 更多 >