我最近在字符編碼上經歷了一個article。我對那裏提到的某個觀點感到擔憂。爲什麼UTF-8使用多個字節來表示某些字符?
在第一個圖中,作者顯示了各種字符集中的字符,它們的代碼點以及它們如何以各種編碼格式進行編碼。 例如,代碼點é是E9
。 在ISO-8859-1
編碼它被表示爲E9
。 在UTF-16
中表示爲00 E9
。 但是在UTF-8
中,它用2個字節表示,C3 A9
。
我的問題是爲什麼這是必需的?它可以用1個字節表示。爲什麼使用兩個字節?你能讓我知道嗎?
我最近在字符編碼上經歷了一個article。我對那裏提到的某個觀點感到擔憂。爲什麼UTF-8使用多個字節來表示某些字符?
在第一個圖中,作者顯示了各種字符集中的字符,它們的代碼點以及它們如何以各種編碼格式進行編碼。 例如,代碼點é是E9
。 在ISO-8859-1
編碼它被表示爲E9
。 在UTF-16
中表示爲00 E9
。 但是在UTF-8
中,它用2個字節表示,C3 A9
。
我的問題是爲什麼這是必需的?它可以用1個字節表示。爲什麼使用兩個字節?你能讓我知道嗎?
UTF-8使用高2位(位6和位7)來指示是否還有字節:只有低6位用於實際字符數據。這意味着任何超過7F
的字符都需要(至少)2個字節。
因爲很多語言是2位編碼,它根本就沒有足夠的編碼所有字母的所有字母 看 2位編碼00 .. FF 15^2 = 255個字符 4位0000 ... FFFF 4^15 = 50625
單個字節可以保存256個不同值之一。
這意味着將每個字符表示爲單個字節(例如ISO-8859-1)的編碼不能編碼超過256個不同的字符。這就是爲什麼您不能使用ISO-8859-1來正確書寫阿拉伯語,日語或其他許多語言的原因。只有有限的可用空間,並且已被其他字符用完。
另一方面,UTF-8需要能夠表示Unicode中所有數以百萬計的字符。這使得不可能將每一個字符壓縮成一個字節。
UTF-8的設計者選擇以使所有ASCII字符(U + 0000到U + 007F)可表示與單個字節的,並且所需的所有其他字符將被存儲爲兩個或多個字節。如果他們選擇給予更多的字符一個單字節表示,其他字符的編碼將會更長更復雜。
如果您需要一個可視解釋,說明爲什麼7F
以上的字節不能表示相應的8859-1字符,請查看UTF-8 coding unit table on Wikipedia。您將會看到,ASCII範圍之外的每個字節值已經具有含義,或者由於歷史原因是非法的。在表中沒有用字節表示它們的8859-1等價物的空間,並且賦予這些字節額外的含義會破壞UTF-8的幾個重要屬性。
好,清晰,量化的答案。您不能在一個字節中表示一百萬個字符。 –
我明白只有2^8個值可以用8位表示。我的問題是關於Code Point「E9」的編碼。代表這8位就足夠了。在UTF-16中是00E9。在UTF-8中,它是C3A9。爲什麼他們不能只使用E9? – Apps
UTF-8已經使用以'E'開始的字節來表示三字節序列的開始。例如,代碼點U + 9A69(歡)被編碼爲「E9 A9 A9」。如果使用'E9'來表示U + 00E9,這將不起作用,您將不得不以不同的方式完全重新設計編碼。 –
謝謝波西米亞。這確實說明了我的問題。 – Apps
utf-8的天才之處在於通過檢查兩個高位可以確定您是否處於角色的開始或中間位置。這是一個困擾較早嘗試「寬」字符集的問題;當你將字符串串到字符串的中間時,你不知道字節是字符的開始還是中間,或者在「轉換爲寬」/「轉換爲8位」編碼的位置,最後一個轉換字符是什麼。 –