encode方法如何在Python中返回非十六进制代码点?

时间:2014-10-11 02:52:11

标签: python encoding decoding hexdump

当我检查 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'是什么意思?

2 个答案:

答案 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