当我检查 gb18030 的代码点时,有一些特殊的中文单词,如'觱''踨'。
>>>
u'觱'.encode('gb18030')
'\xd3v'
我对代码点'\ xd3v'感到困惑。它不是正确的十六进制数字 谁可以清楚地解释清楚?
实际上,我的任务是将 gb18030 的代码点转换为“CDF2”,“F4A5”等...... 其相应的unicode编码。
>>>
'CDF2'.decode('hex').decode('gb18030')
u'\u4e07'
但,
>>>
'd3v'.decode('hex').decode('gb18030')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/encodings/hex_codec.py", line 42, in hex_decode
output = binascii.a2b_hex(input)
TypeError: Odd-length string
所以,我不明白为什么encode方法返回非十六进制代码点 例如,'\ xd3v'的'v'是什么意思?
答案 0 :(得分:1)
'\xd3v' == '\xd3\x76'
。 Python打印ASCII printables(包括\n
,\t
,...)作为字母而不是十六进制格式。
>>> '\xd3v' == '\xd3\x76'
True
如果您想获得十六进制格式,请使用encode('hex')
(与解码时一样)
>>> u'觱'.encode('gb18030').encode('hex')
'd376'
或使用binascii.hexlify
:
>>> binascii.hexlify(u'觱'.encode('gb18030'))
'd376'
答案 1 :(得分:0)
只是&#34; v&#34; - 编码在&#34; gb18030&#34;编码由两个字节表示,一个是&#34; \ xd3&#34; - dec 211 - 另一个是dec-118。显示字节字符串表示时,Python 2.x的默认行为是将ASCII rabge中的字节显示为32-127作为ASCII编码,将此范围外的字符显示为2位数的十字形表示。
Thus:
>>> a = u'觱'.encode('gb18030')
>>> ord(a[0])
211
>>> ord(a[1])
118
现在,如果您在gb18030终端中进行编辑,只需看到实际的STR表示而不是repr,就会显示原始的中文字符。
>>> print a