我有一个十六进制列表,我想将其转换为unicode字符列表。这里的一切都是用python-3.5完成的。
如果我print(binary.fromhex('hex_number').decode('utf-8'))
它有效。但是,如果在转换后我再次存储列表中的字符,则无效:
a = ['0063'] # Which is the hex equivalent to the c char.
b = [binary.fromhex(_).decode('utf-8') for _ in a]
print(b)
将打印
['\x00c']
而不是
['c']
代码
a = ['0063']
for _ in a:
print(binary.fromhex(_).decode('utf-8'))
打印,预计:
c
有人可以向我解释如何转换列表['0063']
中的列表['c']
以及为什么我会让这个奇怪(对我而言)行为?
要查看0063
十六进制对应的内容here。
答案 0 :(得分:2)
如果0063为U+0063 LATIN SMALL LETTER C,则您没有UTF-8数据。 充其量您有UTF-16 data,大端序:
>>> binary.fromhex('0063').decode('utf-16-be')
'c'
您可能想要检查完整数据是否以Byte Order Mark开头,对于以十六进制为'FEFF'
的大端UTF-16,此时您可以删除-be
后缀,因为解码器将知道要使用的字节顺序。如果您的数据以'FFFE'
开头,则您有 little-endian 编码的UTF-16,并且您在错误的位置切分数据;在这种情况下,您使用了前一个代码点的'00'
字节。
UTF-8是可变宽度编码。 Unicode标准中的前128个代码点(与ASCII范围对应)直接编码为单个字节,直接映射到ASCII标准。 Latin-1范围及以上的代码点(直到U + 07FF (*),接下来的1919个代码点)映射到两个字节等。
如果您的输入确实是UTF-8,那么在'c'
之前您确实有\x00
NULL character。打印NULL会导致许多终端无输出,但您可以使用cat -v
将此类不可打印字符转换为插入符转义码:
$ python3 -c "print('\x00c')"
c
$ python3 -c "print('\x00c')" | cat -v
^@c
^@
是cat
使用的caret notation中NULL的表示形式。
(*) U + 07FF当前未在Unicode中映射;目前可能的最后一个UTF-8双字节码点是U+07FA NKO LAJANYALAN。
答案 1 :(得分:1)
a = ['0063'] # Which is the hex equivalent to the c char.
b = [chr(int(x,16)) for x in a]
print(b)
感谢1