UTF-8和UTF-16简介
首先介紹unicode,最開始計劃有31位,但到后來一執行,發現0x 0~10FFFF就夠用了,僅有21位。
UTF-8是一種變長、多字節編碼方案,從一字節模式,到六字節模式。雖然unicode只到21位,但是查看pcre2的源代碼發現,對UTF-8的支持到六字節。
0******* 110***** 10****** 1110**** 10****** 10****** 11110*** 10****** 10****** 10******這里僅羅列到四字節模式。
分析一個UTF-8編碼的文件,看第一個字節是否是0開頭的,如果是,就是一字節模式,該模式兼容基本ASCII碼,也是128個碼位。
如果第一字節以110開頭,則使用雙字節模式,接下來的那個字節以10開頭。
如果是1110開頭則是三字節模式,如果是11110開頭則是四字節模式。
UTF-16有雙字節模式、四字節模式兩種。
******** ******** 110110** ******** 110111** ********有人會發現,雙字節模式下,遍歷了16比特的全部65536種情況,那該怎樣區分雙字節模式和四字節模式呢?
原來,設計unicode時早有安排,編碼110110-- --------對應的1024個碼位留空。因為有10個星號,所以是1024個碼位。同理,編碼110111-- --------對應的1024個碼位也為空。共有2048個碼位留空,專門為了UTF-16能正常工作。
即使這樣,四字節模式的UTF-16也只有20個星號啊,可unicode最多有21位,還差1位呢?
算法是這樣的:
設待編碼為U,當0≤U≤FFFF時,采用雙字節模式,此時的U不超過16位,雙字節正好放得下。
若10000≤U≤10FFFF,則需計算U’=U-0x10000,U’的取值范圍是:0≤U’≤FFFFF,U’不大于20位,可以放在四字節模式的模板內。
關于UTF-8和UTF-16的討論,和漢字的長度有關。在UTF-8中,一個漢字占用3字節。這里說的是基本漢字那2萬多個,對于不常用的漢字,需占用4字節。在UTF-16中,一個基本漢字占用2字節。
許多程序員,尤其是老程序員,他們年輕時,unicode還未普及,那時人們記住了:一個漢字兩個字節。所以,他們更容易選擇UTF-16。還有人堅定地選擇GBK,這是一種中國的國標編碼。
然后,互聯網普及了。人們發現各國的編碼不通用,所以就有了unicode。
至于UTF-8中一個漢字占3字節,這沒什么的。表達同樣的意思,用英語和用漢語,英語的字母個數,約是漢字個數的3倍。如integer,7字節;整數,6字節。二者相差不大。
另外,UTF-16有大端小端問題。且UTF-16已經滿了,不能擴充,它甚至需要計算U’來壓縮至20位。而UTF-8沒有大端小端問題,且可以擴充至31位。
所以,我更喜歡UTF-8,至于GB2312、GBK等編碼,早已不再使用了。
總結
以上是生活随笔為你收集整理的UTF-8和UTF-16简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: utf8和utf8mb4的区别详解
- 下一篇: J0ker的CISSP之路:How CI