通常將一個標准中能夠表示的所有字符的集合稱為字符集,比如ISO/Unicode所定義的字符集為Unicode。在Unicode中,每個字符占據一個碼位/Unicode 編號(用4位十六進制數表示,Code point:U+ FFFF),如U+ 0000為“Null”,U+ 597D="好"。Unicode字符集共定義了1 114 112個這樣的位,使用從0到10FFFF的十六進制數唯一地表示世界上幾乎所有的字符。
NCR(Numeric Character Reference),以「&#」開頭的后接十進制數字,以「&#x」開頭的后接十六進制數字。數字取值為目標字符的 Unicode code point。U+002C === ,
雖然字符集中的碼位唯一,但由於計算機存儲數據通常是以字節為單位的,而且出於兼容之前的ASCII(0x00-0x7F)、節省存儲空間等諸多原因,需要一種具體的編碼方式來對字符碼位進行標識。規定每個字符的Unicode編號如何存儲(用一個字節還是多個字節存儲,用哪些字節來存儲),這個規定就叫做“編碼”。常見的基於Unicode字符集的編碼方式有UTF-8、UTF-16及UTF-32。
字符集中的字符與Unicode 編號一一映射,對Unicode編號進行編碼轉為二進制存入內存。同一段二進制,每一個字節一個編號還是每兩個字節一個編號,解碼方式不一樣,得到的編號不一樣,對應的映射字符也不同。這就是亂碼的原因。
編碼方式:
UTF-8是一種變長的編碼方式,采用了高位保留方式來區別不同變長。它使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。越是常用的字符,字節越短,最前面的128個字符,只使用1個字節表示,與ASCII碼完全相同。
UTF-8的編碼規則:
1)對於單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於N字節的符號,第一個字節的前N位都設為1,第N+1位為0,后面字節的前兩位一律設為10。剩下的二進制位,全部為這個符號的unicode碼。
Unicode符號范圍 | UTF-8編碼方式
(十六進制) | (二進制)
——————————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如果一個字節的第一位是0,則這個字節單獨就是一個字符;如果第一位是1,則連續有多少個1,就表示當前字符占用多少個字節。
由於UTF-8這種節省空間的特性,導致它成為互聯網上最常見的網頁編碼。
比如中文'嚴'字,二進制表示成:11100100 10111000 10100101
對應的Unicode code point為 0100 1110 0010 0101對應的HEX值\x4E25