将十六进制转换为十六进制代码点

时间:2018-07-24 14:00:22

标签: python hex encode utf

我有一个这样的十六进制代码:

\xf0\x9f\x94\xb4

我想这样编码:

1F534

如何使用python 2.7中的方法对其进行转换?

谢谢

1 个答案:

答案 0 :(得分:0)

您在这里问的是:如何找到带有(字节)字符串'\xf0\x9f\x94\xb4'的utf8表示的字符的unicode代码?

在Python3中,它很简单:

>>> hex(ord(b'\xf0\x9f\x94\xb4'.decode()))
'0x1f534'

在使用--enable-unicode = ucs4编译的Python2版本中,它或多或少是相同的:

>>> hex(ord('\xf0\x9f\x94\xb4'.decode('utf-8')))
'0x1f534'

但是在发表评论后,您有了使用--enable-unicode = ucs2编译的Python 2.7版本。在这种情况下,Unicode字符串实际上包含该字符串的UTF16表示形式:

>>> print [hex(ord(i)) for i in '\xf0\x9f\x94\xb4'.decode('utf-8')]
['0xd83d', '0xdd34']

无法直接找到U + 1F534大红色圆圈字符的真实Unicode代码点。

最后一个选择是手动解码utf8序列 。您可以在wikipedia上找到有关UTF8编码的描述。以下函数采用Unicode字符的utf-8表示形式并返回其代码点:

def from_utf8(bstr):
    b = [ord(i) for i in bstr]
    if b[0] & 0x80 == 0: return b
    if b[0] & 0xe0 == 0xc0:
        return ((b[0] & 0x1F) << 6) | (b[1] & 0x3F)
    if b[0] & 0xf0 == 0xe0:
        return ((b[0] & 0xF) << 12) | ((b[1] & 0x3F) << 6) | (b[2] & 0x3F)
    else:
        return ((b[0] & 7) << 18) | ((b[1] & 0x3F) << 12) | \
               ((b[2] & 0x3F) << 6) | (b[3] & 0x3F)

当心,这里没有做任何控制来确保字符串是单个字符的正确UTF-8表示形式...但是至少它可以提供预期的结果:

>>> print hex(from_utf8("\xf0\x9f\x94\xb4"))
0x1f534