計算機編碼世界(二)

一. UTF-8詳解

UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
UTF-8的編碼規則很簡單,只有二條:
1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一律設爲10。剩下的沒有提及的二進制位,全部爲這個符號的unicode碼。
下表總結了編碼規則,字母x表示可用編碼的位。(一個字節爲2位的十六進制數)

Unicode符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000-007F | 0xxxxxxx
(0000 0080)-(0000 07FF) | 110xxxxx 10xxxxxx
(0000 0800)-(0000 FFFF) | 1110xxxx 10xxxxxx 10xxxxxx
(0001 0000)-(0010 FFFF) | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟據上表,解讀UTF-8編碼非常簡單。如果一個字節的第一位是0,則這個字節單獨就是一個字符; 如果第一位是1,則連續有多少個1,就表示當前字符佔用多少個字節。
下面,還是以漢字"嚴"爲例,演示如何實現UTF-8編碼。

已知"嚴"的unicode是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800-0000 FFFF), 因此"嚴"的UTF-8編碼需要三個字節,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。 然後,從"嚴"的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。 這樣就得到了,"嚴"的UTF-8編碼是"11100100 10111000 10100101",轉換成十六進制就是E4B8A5。
由此可見,UTF-8可以表示21位的長度,至少可以表示200萬左右的字符,足以.

二. 實例

下面,舉一個實例。 打開Editplus,新建一個文本文件,內容就是一個"嚴"字,依次採用ANSI,Unicode,Unicode big endian 和 UTF-8編碼方式。 然後,用文本編輯的"十六進制功能",觀察該文件的內部編碼方式。(BOM只出現一次)
1)ANSI:文件的編碼就是兩個字節"D1 CF",這正是"嚴"的GB2312編碼,這也暗示GB2312是採用大頭方式存儲的。
2)Unicode(默認小頭):FF FE 25 4E(前倆字節爲BOM)
3)Unicode big endian:FE FF 4E 25(前倆字節爲BOM)
4)UTF-8 +BOM:EF BB BF E4 B8 A5(前三個字節爲BOM) 5)UTF-8 :E4 B8 A5

三. 補充

1.文本以什麼字節保存稱爲編碼,以什麼方式打開稱爲解碼.
2.當編碼和解碼使用相同的方式時,纔不會出現亂碼
3.當我們打開文本時,計算機會識別文本的編碼方式,但不全是這樣.
4.我們知道UTF-8對於單字節的處理和ASCII一樣,所以當我們用UTF-8編碼ASCII僅有 的字符集合,當我們打開文本時默認是ANSI.

5.ANSI中文默認爲GB2312可以表示日語,但無法表示韓語,輸入韓語亂碼且無法保存

原創摘自:http://beadlechen.github.io/content/blog.html#category=software#article=encode2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章