Unicode字符集和編碼方式


通常將一個標准中能夠表示的所有字符的集合稱為字符集,比如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

 

Unicode字符集https://unicode-table.com/en/#control-character


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM