官术网_书友最值得收藏!

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

主站蜘蛛池模板: 朝阳市| 兰西县| 剑河县| 商洛市| 上栗县| 大渡口区| 翁牛特旗| 黑水县| 鄂托克前旗| 梨树县| 佛冈县| 甘孜| 灵寿县| 平乡县| 宁津县| 平武县| 封丘县| 阳春市| 抚宁县| 江陵县| 绥宁县| 肥城市| 洛阳市| 织金县| 梁河县| 宜宾县| 麻城市| 宜阳县| 鹤岗市| 甘孜| 六安市| 界首市| 津市市| 泉州市| 柏乡县| 西充县| 武宣县| 株洲市| 苍南县| 延川县| 杨浦区|