Python:将Unicode十六进制字符串转换为Unicode
我有一个十六进制字符串,是通过一个函数从一个Unicode字符串生成的:
def toHex(s):
res = ""
for c in s:
res += "%02X" % ord(c) #at least 2 hex digits, can be more
return res
hex_str = toHex(u"...")
这个函数返回的字符串像这样:
"80547CFB4EBA5DF15B585728"
这是一串由6个汉字组成的符号。
但是
u"Knödel"
转换成了
"4B6EF664656C"
现在我需要一个函数,把这个字符串再转换回原来的Unicode。汉字的表示方式是2个字节,而第二个例子中的所有字符都是1个字节的表示。所以我不能简单地对每个1字节或2字节的块使用unichr()。
我已经尝试过
binascii.unhexlify(hex_str)
但这个方法似乎是逐字节转换,返回的是字符串,而不是Unicode。我还尝试过
binascii.unhexlify(hex_str).decode(...)
用不同的格式,但始终没有得到原来的Unicode字符串。
非常感谢你的帮助!
3 个回答
0
我之前在一个VB应用程序中处理Unicode时发现,如果前面有一个或两个“0”,它们会被自动去掉。比如说“&H00A2”会变成“&HA2”。为了解决这个问题,我写了一个小函数来检查字符串的长度,如果长度少于4个字符,就给它加上缺少的“0”。我不确定你遇到的情况是不是这样,但我觉得分享这个信息可能对你有帮助。
1
这件事做不到。使用 %02X
会丢失太多信息。你应该先使用像UTF-8这样的编码,然后再进行转换,而不是自己发明一个有问题的编码方式。
>>> u"Knödel".encode('utf-8').encode('hex')
'4b6ec3b664656c'
4
这看起来运行得很好:
binascii.unhexlify(binascii.hexlify(u"Knödel".encode('utf-8'))).decode('utf-8')
返回到原来的对象。如果中文文本编码得当,你也可以这样做,不过 ord(x)
已经把你开始的文本搞坏了。你需要先对它进行编码,然后才能像处理字节串一样处理它。