在Python 2中,将字符串的十六进制形式转换为相应的unicode非常简单:
comments.decode("hex")
其中变量'comments'是文件中一行的一部分(该行的其余部分 not 需要转换,因为它仅以ASCII表示。
然而,现在在Python 3中,这不起作用(我假设因为字节/字符串与字符串/ unicode开关。我觉得Python 3中应该有一个单行程来做同样的事情,而不是将整行读作一系列字节(我不想这样做),然后分别转换行的每一部分。如果可能,我想将整行读作unicode字符串(因为该行的其余部分是unicode)并且只从十六进制表示转换这一部分。
答案 0 :(得分:62)
类似的东西:
>>> bytes.fromhex('4a4b4c').decode('utf-8')
'JKL'
只需输入您正在使用的实际编码。
答案 1 :(得分:9)
import codecs
decode_hex = codecs.getdecoder("hex_codec")
# for an array
msgs = [decode_hex(msg)[0] for msg in msgs]
# for a string
string = decode_hex(string)[0]
答案 2 :(得分:0)
@unbeli和@Niklas的答案很好,但是@unbeli的答案不适用于所有十六进制字符串,因此希望在不导入额外库(编解码器)的情况下进行解码。以下应该可以工作(但对于大字符串而言效率不高):
>>> result = bytes.fromhex((lambda s: ("%s%s00" * (len(s)//2)) % tuple(s))('4a82fdfeff00')).decode('utf-16-le')
>>> result == '\x4a\x82\xfd\xfe\xff\x00'
True
基本上,它通过填充零并解码为utf-16来解决无效utf-8字节的问题。
答案 3 :(得分:0)
这是另一个更简单的恕我直言。
JObject
示例:
''.join[[chr("0x" + hex) for hex in sequence])