[英]Decoding list of hex in python3
我有一個十六進制列表,我想將其轉換為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
有人可以向我解釋我如何轉換列表['c']
的列表['0063']
['c']
以及為什么我會得到這種奇怪的(對我來說)行為?
要查看0063
十六進制對應的內容,請查看此處 。
如果0063是U + 0063 LATIN SMALL LETTER C ,則沒有UTF-8數據。 充其量你有UTF-16數據 ,大端序:
>>> binary.fromhex('0063').decode('utf-16-be')
'c'
您可能想檢查您的完整數據是否以字節順序標記開頭,對於以十六進制表示為'FEFF'
big-endian UTF-16,此時您可以刪除-be
后綴,因為解碼器將知道哪個字節為了使用。 如果您的數據以'FFFE'
開頭,則您使用little-endian編碼的UTF-16,並將數據'FFFE'
到錯誤的位置; 在這種情況下,您為前面的代碼點帶了'00'
字節。
UTF-8是可變寬度編碼。 Unicode標准中的前128個代碼點(與ASCII范圍對應)直接編碼為單個字節,直接映射到ASCII標准。 Latin-1范圍及更高范圍內的代碼點(直到U + 07FF (*) ,接下來的1919個代碼點)映射到兩個字節等。
如果您的輸入確實是UTF-8,那么在'c'
之前你真的有一個\\x00
NULL字符 。 打印NULL會導致許多終端無輸出,但您可以使用cat -v
將這些不可打印的字符轉換為插入轉義碼 :
$ python3 -c "print('\x00c')"
c
$ python3 -c "print('\x00c')" | cat -v
^@c
(*) U + 07FF當前未以Unicode格式映射; 目前可能的最后一個UTF-8雙字節碼點是U + 07FA NKO LAJANYALAN 。
a = ['0063'] # Which is the hex equivalent to the c char.
b = [chr(int(x,16)) for x in a]
print(b)
感謝1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.