2013-06-25 126 views
-1

我一直在閱讀很多來源,但我仍然對如何計算它感到困惑。 我做它要求一個練習:如何將十六進制代碼轉換爲二進制代碼?

以下哪些比特序列(表示爲十六進制數)表示有效UFT-8字符串,並在情況下,他們是合法的UTF-8字符串,代碼多少呢位序列對應於?

0x30c0 
0x303C 
0xE0ADAA 
0x3AA 
+2

什麼讓您感到困惑?將十六進制轉換爲二進制或UTF-8的工作方式? – Joni

+0

我很困惑如何翻譯如0x303c –

+0

C被翻譯成1100然後3是11然後0是0然後x是1011所以爲什麼答案是11000000111100 Joni –

回答

2

首先一個定義: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代碼點。

+0

謝謝sylvain;) –

+0

@ErikaSawajiri我擴大了我的回答向您展示如何提取unicode字符的代碼點以及如何查詢Unicode數據庫以獲取與字符相對應的正式名稱。 –

+0

Sylvain非常感謝你! 〜 –

1

這個問題非常糟糕。這些都是數字,而不是字符串。我懷疑這意味着代表字節序列,在這種情況下,他們應該寫它:

0x30 0xc0 
0x30 0x3C 
0xE0 0xAD 0xAA 
0x03 0xAA 

...或者類似的東西。

如果這其實就是問題的手段(不清楚),那麼就可以通過瑣碎的檢查看到哪些是無效的UTF-8:

  • 第一個是無效的。字節0xc0永遠不會有效的UTF-8。
  • 第二個只包含ASCII,所以根據定義它也是有效的UTF-8。
  • 第三個乍一看正確的形式(第一個字節大於0xc1,第二個和第三個0x80和0xbf之間)。您可以按照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 
>>> 
+0

我編輯過!非常感謝 ;) –

相關問題