从 python 中的字符串生成 unicode obj?
Produce unicode obj from string in python?
test = unicode('\x03B', 'utf-16BE', 'ignore')
产生乱码。我想 test 是一个分号。如果我用 '\x03~'
替换十六进制,我会得到一个分号。
我的问题是为什么?我以为分号的unicode值是003B?
谢谢!
您未能正确指定 UTF-16 编码的分号,它由两个八位字节组成,\x00
和 \x3B
。正确的说法是:
test = unicode('\x00\x3B', 'utf-16BE', 'ignore')
这会按预期生成 Unicode 分号。
不止一个看起来像分号的字符。自从你
提到'\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
test = unicode('\x03B', 'utf-16BE', 'ignore')
产生乱码。我想 test 是一个分号。如果我用 '\x03~'
替换十六进制,我会得到一个分号。
我的问题是为什么?我以为分号的unicode值是003B?
谢谢!
您未能正确指定 UTF-16 编码的分号,它由两个八位字节组成,\x00
和 \x3B
。正确的说法是:
test = unicode('\x00\x3B', 'utf-16BE', 'ignore')
这会按预期生成 Unicode 分号。
不止一个看起来像分号的字符。自从你
提到'\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