我一直在閱讀很多來源,但我仍然對如何計算它感到困惑。 我做它要求一個練習:如何將十六進制代碼轉換爲二進制代碼?
以下哪些比特序列(表示爲十六進制數)表示有效UFT-8字符串,並在情況下,他們是合法的UTF-8字符串,代碼多少呢位序列對應於?
0x30c0 0x303C 0xE0ADAA 0x3AA
我一直在閱讀很多來源,但我仍然對如何計算它感到困惑。 我做它要求一個練習:如何將十六進制代碼轉換爲二進制代碼?
以下哪些比特序列(表示爲十六進制數)表示有效UFT-8字符串,並在情況下,他們是合法的UTF-8字符串,代碼多少呢位序列對應於?
0x30c0 0x303C 0xE0ADAA 0x3AA
首先一個定義:UTF-8編碼的Unicode代碼點爲1到6個字節的序列。
0x30C0使用十六進制表示法來表示2個字節。假定高位字節首先出現在字節序列中,這相當於0x30,後跟0xC0。可以編寫在Python 3:
>>> seq = b"\x30\xC0"
>>> seq
b'0\xc0'
假設這可能是字節UTF-8編碼的流,我們可以嘗試decode
方法:
>>> seq.decode("UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
???不起作用。序列不正確的UTF-8。
讓下一個序列做相同的:
>>> seq = b"\x30\x3C"
>>> seq.decode("UTF-8")
'0<'
啊,啊!沒有例外。這是正確的UTF-8,對應於2個碼點的字符串0<
。
第三是有趣:
>>> seq = b"\xE0\xAD\xAA"
>>> seq.decode("UTF-8")
'୪'
>>> len(seq.decode("UTF-8"))
1
這些3字節用於編碼只有一個代碼點。 但是哪個角色〜哼哼〜「代碼點」是這個? Python有ord
函數知道:
>>> ord(seq.decode("UTF-8"))
2922
代碼點2922(十六進制)。這是十六進制...
>>> "{:04X}".format(ord(seq.decode("UTF-8")))
'0B6A'
所以字節編碼0xE0 0xAD 0xAA
的順序爲UTF-8的Unicode代碼點U+0B6A
。但是那個角色呢? Python的嵌入模塊查詢Unicode數據庫:
>>> import unicodedata
>>> unicodedata.name(seq.decode("UTF-8"))
'ORIYA DIGIT FOUR'
因此,它是:這是對應於digit 4 in Oriya writing system代碼點。
謝謝sylvain;) –
@ErikaSawajiri我擴大了我的回答向您展示如何提取unicode字符的代碼點以及如何查詢Unicode數據庫以獲取與字符相對應的正式名稱。 –
Sylvain非常感謝你! 〜 –
這個問題非常糟糕。這些都是數字,而不是字符串。我懷疑這意味着代表字節序列,在這種情況下,他們應該寫它:
0x30 0xc0
0x30 0x3C
0xE0 0xAD 0xAA
0x03 0xAA
...或者類似的東西。
如果這其實就是問題的手段(不清楚),那麼就可以通過瑣碎的檢查看到哪些是無效的UTF-8:
0xc0
永遠不會有效的UTF-8。0xaa
沒有一個多字節序列的有效第一個字節。OR,你可以嘗試讓電腦對它們進行解碼,它會給你一個錯誤是無效的。例如,使用Python版本3,
>>> bytes([0x30,0xc0]).decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
>>> bytes([0x30,0x3c]).decode('utf-8')
'0<'
>>> bytes([0xe0,0xad,0xaa]).decode('utf-8')
'୪'
>>> bytes([0x03,0xaa]).decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte
>>>
我編輯過!非常感謝 ;) –
什麼讓您感到困惑?將十六進制轉換爲二進制或UTF-8的工作方式? – Joni
我很困惑如何翻譯如0x303c –
C被翻譯成1100然後3是11然後0是0然後x是1011所以爲什麼答案是11000000111100 Joni –