我有一个这样的十六进制代码:
\xf0\x9f\x94\xb4
我想这样编码:
1F534
如何使用python 2.7中的方法对其进行转换?
谢谢
答案 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