Python:将Unicode-Hex字符串转换为Unicode

5

我有一个十六进制字符串,是通过以下函数从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个回答

4

这似乎完全正常:

binascii.unhexlify(binascii.hexlify(u"Knödel".encode('utf-8'))).decode('utf-8')

回到原始对象。如果中文文本已经正确编码,您可以对其执行相同的操作,但是 ord(x) 已经破坏了您开始时的文本。您需要先将其编码,然后才能像字节串一样处理。


谢谢你的回答!我的问题是,我从第三方软件中获取十六进制字符串,因此我无法控制编码... - Robert
问他们是什么编码,否则你将无法正确解码它... - viraptor
此外,似乎文本可能是utf-16编码。binascii.unhexlify("80547CFB4EBA5DF15B585728").decode('utf-16')返回的似乎是一些亚洲语言(无法验证具体是哪种语言)。 - viraptor
非常感谢!看起来是UTF-16大端字节顺序!(codecs.BOM_UTF16_BE + binascii.unhexlify("80547CFB4EBA5DF15B585728")).decode('utf-16')似乎做了正确的事情。 再次感谢您的回答! - Robert

1
无法完成。使用%02X会丢失太多信息。您应该先使用类似于UTF-8的编码,然后进行转换,而不是发明一个错误的编码方式。
>>> u"Knödel".encode('utf-8').encode('hex')
'4b6ec3b664656c'

谢谢你的回答!我的问题是,我从第三方软件中获取十六进制字符串,因此我无法影响编码方式... 所以你的意思是,没有办法确定地重构出“80547CFB4EBA5DF15B585728”的含义吗? - Robert
这是正确的。除非您同意一致的协议,否则强制编码作为代码的方式就不是。 - Ignacio Vazquez-Abrams
@Robert:如果使用已知的编码方式制作,你可以获取文本,例如UTF-8或UTF-16。 - JeremyP

0
当我一段时间前在VB应用程序中使用Unicode时,如果第一个或两个数字是“0”,它们将被删除。这意味着“&H00A2”会自动转换为“&HA2”。我只需创建一个小函数来检查字符串的长度,如果少于4个字符,则添加缺少的0。我不确定这是否是你遇到的问题,但我想提供这些信息以便注意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接