1. ASCII碼 1> ASCII碼不包括我們輸入法中的"特殊字元"和"數學字元"等,他們都屬於擴展ASCII 字元 2. GBK編碼 GBK實際上是ASCII的中文擴展編碼,其規則是: 1> 如果第一個位元組的大於127(0x7F, 0111 1111,即最高位為0),則表示從這個位元組開始的2個字... ...
1. ASCII碼
1> ASCII碼不包括我們輸入法中的"特殊字元"和"數學字元"等,他們都屬於擴展ASCII 字元
2. GBK編碼
GBK實際上是ASCII的中文擴展編碼,其規則是:
1> 如果第一個位元組的大於127(0x7F, 0111 1111,即最高位為0),則表示從這個位元組開始的2個位元組是表示一個漢字,否則,則是一個英文ASCII碼
2> GBK是相容ASCII的
3> GBK的漢字編碼占用2個位元組
4> 這類編碼方式統稱為做 “DBCS“(Double Byte Charecter Set 雙位元組字元集)
3. Unicode編碼
Unicode是為瞭解決ASCII的各類擴展編碼方式不統一的問題(比如GBK和臺灣的漢字編碼就不相容),而制定的採用多位元組統一編碼世界所有字元的編碼方案,所以Unicode能顯示各國的字元編碼
1> Unicode編碼包括UCS-2, UCS-4,分別用2, 4個位元組表示一個字元,通用的是UCS-2
2> 由於多個位元組在記憶體中的儲存設計到字元順序的問題
3> Unicode表示ASCII碼時,是將高位位元組全置為0,所以Unicode和ASCII是不相容的
Magic Header(by byte) | Exmaple("中":0x4E2D) | |
小尾(LE) | FF, FE | FF, FE, 2D, 4E |
大尾(BE) | FE, FF | FE, FF, 4E, 2D |
4. UTF-8
UCS-2表示英文字母會浪費一個位元組,而世界上大部分的資料都是用英文的,所以用Unicode編碼進行文件傳輸和保存的時候就極為浪費帶寬和硬碟, 因此就有了UTF-8, UTF-16的出現來拯救世界
UTF :(UCS Transfer Format)
1> UTF-8:UTF-8是一種變長的編碼方式,可以用1~4個位元組表示一個字元
2> UTF-8的原碼還是Unicode,只是其將Unicode進行了格式化編碼,轉化方式:
2.1 單位元組的字元(如英文),位元組的第一位設為0,對於英語,UTF-8碼只占用一個位元組,和ASCII碼完全相同;
2.2 需用n個位元組的字元(n>1),第一個位元組的前n位設為1,第n+1位設為0,後面位元組的前兩位都設為10,這n個位元組的其餘空位填充該字元unicode碼(2進位的),高位用0補足。
如格式化字元:"中"(0x4E2D, 0100 1110 0010 1101)
(1) "中"占用2個位元組,因為UTF-8需要多的bit來做標記,所以至少需要多餘2個位元組的空間來轉UTF-8,先設n=3
(2) 3個位元組各自的標記bit如下:
1 : 1110 0000
2 : 1000 0000
3 : 1000 0000
(3) 我們發現剩下的空的bit位數 = 4 + 6 + 6 = 16 = 2位元組,剛好夠放一個Unicode,依次將"中"(0100 1110 0010 1101)的2進位bit放入
1 : 1110 0100 0xE4
2 : 1011 1000 0xB8
3 : 1010 1101 0xAD
(4) 雖然Unicode填入UTF-8的模板沒說是大尾還是小尾,而是用我們正常看2進位數的順序填入的,但這個順序其實是一個大尾(0x4E放在前面轉bit)
3> Windows中,會使用BOM來標記編碼順序,UTF-8由於沒有編碼順序,Windows就用BOM = EF BB BF來表示UTF-8編碼,但很多系統和軟體中是不認這個BOM的
4> "®"字元的Unicode編碼是0x00AE,在UTF-8編碼中是採用2個位元組的模板來編碼的:C2 AE = 1100 0010 1010 1110,抽取出來就是0 0010 10 1110 = 000 1010 1110,然後高位補0 = 0000 0000 1010 1110 = 0xAE,也就是說Unicode編碼高位為00的字元,在UTF-8中都可以用2位元組的模板來編碼,可以節省一個位元組