- 現(xiàn)代C++語言核心特性解析
- 謝丙堃
- 959字
- 2021-09-27 17:49:48
1.2.1 字符集和編碼方法
通常我們所說的字符集是指系統(tǒng)支持的所有抽象字符的集合,通常一個(gè)字符集的字符是穩(wěn)定的。而編碼方法是利用數(shù)字和字符集建立對(duì)應(yīng)關(guān)系的一套方法,這個(gè)方法可以有很多種,比如Unicode字符集就有UTF-8、UTF-16和UTF-32這3種編碼方法。除了Unicode字符集,我們常見的字符集還包括ASCII字符集、GB2312字符集、BIG5字符集等,它們都有各自的編碼方法。字符集需要和編碼方式對(duì)應(yīng),如果這個(gè)對(duì)應(yīng)關(guān)系發(fā)生了錯(cuò)亂,那么我們就會(huì)看到計(jì)算機(jī)世界中令人深惡痛絕的亂碼。不過,現(xiàn)在的計(jì)算機(jī)世界逐漸達(dá)成了一致,就是盡量以Unicode作為字符集標(biāo)準(zhǔn),那么剩下的工作就是處理UTF-8、UTF-16和UTF-32這3種編碼方法的問題了。
UTF-8、UTF-16和UTF-32簡(jiǎn)單來說是使用不同大小內(nèi)存空間的編碼方法。
UTF-32是最簡(jiǎn)單的編碼方法,該方法用一個(gè)32位的內(nèi)存空間(也就是4字節(jié))存儲(chǔ)一個(gè)字符編碼,由于Unicode字符集的最大個(gè)數(shù)為0x10FFFF(ISO 10646),因此4字節(jié)的空間完全能夠容納任何一個(gè)字符編碼。UTF-32編碼方法的優(yōu)點(diǎn)顯而易見,它非常簡(jiǎn)單,計(jì)算字符串長(zhǎng)度和查找字符都很方便;缺點(diǎn)也很明顯,太占用內(nèi)存空間。
UTF-16編碼方法所需的內(nèi)存空間從32位縮小到16位(占用2字節(jié)),但是由于存儲(chǔ)空間的縮小,因此UTF-16最多只能支持0xFFFF個(gè)字符,這顯然不太夠用,于是UTF-16采用了一種特殊的方法來表達(dá)無法表示的字符。簡(jiǎn)單來說,從0x0000~0xD7FF以及0xE000~0xFFFF直接映射到Unicode字符集,而剩下的0xD800~0xDFFF則用于映射0x10000~0x10FFFF的Unicode字符集,映射方法為:字符編碼減去0x10000后剩下的20比特位分為高位和低位,高10位的映射范圍為0xD800~0xDBFF,低10位的映射范圍為0xDC00~0xDFFF。例如0x10437,減去0x10000后的高低位分別為0x1和0x37,分別加上0xD800和0xDC00的結(jié)果是0xD801和0xDC37。
幸運(yùn)的是,一般情況下0xFFFF足以覆蓋日常字符需求,我們也不必為了UTF-16的特殊編碼方法而煩惱。UTF-16編碼的優(yōu)勢(shì)是可以用固定長(zhǎng)度的編碼表達(dá)常用的字符,所以計(jì)算字符長(zhǎng)度和查找字符也比較方便。另外,在內(nèi)存空間使用上也比UTF-32好得多。
最后說一下我們最常用的UTF-8編碼方法,它是一種可變長(zhǎng)度的編碼方法。由于UTF-8編碼方法只占用8比特位(1字節(jié)),因此要表達(dá)完數(shù)量高達(dá)0x10FFFF的字符集,它采用了一種前綴編碼的方法。這個(gè)方法可以用1~4字節(jié)表示字符個(gè)數(shù)為0x10FFFF的Unicode(ISO 10646)字符集。為了盡量節(jié)約空間,常用的字符通常用1~2字節(jié)就能表達(dá),其他的字符才會(huì)用到3~4字節(jié),所以在內(nèi)存空間可以使用UTF-8,但是計(jì)算字符串長(zhǎng)度和查找字符在UTF-8中卻是一個(gè)令人頭痛的問題。表1-1展示了UTF-8對(duì)應(yīng)的范圍。
▼表1-1

- Learning C# by Developing Games with Unity 2020
- C程序設(shè)計(jì)簡(jiǎn)明教程(第二版)
- Spring Boot+Spring Cloud+Vue+Element項(xiàng)目實(shí)戰(zhàn):手把手教你開發(fā)權(quán)限管理系統(tǒng)
- Java程序員面試算法寶典
- PHP+MySQL+Dreamweaver動(dòng)態(tài)網(wǎng)站開發(fā)實(shí)例教程
- Mastering Python Networking
- 軟件架構(gòu):Python語言實(shí)現(xiàn)
- 網(wǎng)站構(gòu)建技術(shù)
- Clojure Reactive Programming
- Android開發(fā)案例教程與項(xiàng)目實(shí)戰(zhàn)(在線實(shí)驗(yàn)+在線自測(cè))
- Windows內(nèi)核編程
- C專家編程
- Managing Microsoft Hybrid Clouds
- Serverless工程實(shí)踐:從入門到進(jìn)階
- C++從零開始學(xué)(視頻教學(xué)版)(第2版)