将十六进制转换为十六进制代码点
trasform hex to hexcodepoint
我有这样的十六进制代码:
\xf0\x9f\x94\xb4
我想这样编码:
1F534
如何使用 python 2.7 中的方法对其进行转换?
谢谢
在这里你只是问:如何找到用(字节)字符串'\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 编码的说明。以下函数采用 utf-8 表示 unicode 字符和 return 其代码点:
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
我有这样的十六进制代码:
\xf0\x9f\x94\xb4
我想这样编码:
1F534
如何使用 python 2.7 中的方法对其进行转换?
谢谢
在这里你只是问:如何找到用(字节)字符串'\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 编码的说明。以下函数采用 utf-8 表示 unicode 字符和 return 其代码点:
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