Unicode编码详解
Unicode定義:
Unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案等。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。
ASCll碼與Unicode編碼不同
對(duì)于很多初學(xué)者來(lái)說(shuō),特別容易將這兩個(gè)概念混淆,認(rèn)為ASCLL碼就是Unicode編碼,這是明顯錯(cuò)誤的。
我們知道:1個(gè)byte=8bit,1個(gè)bit=1位二進(jìn)制數(shù),一位二進(jìn)制數(shù)又可以用0或者1來(lái)表示。所以一個(gè)字節(jié)能表示最大的數(shù)字就是256。計(jì)算機(jī)是美國(guó)人發(fā)明的,而英文中涉及的編碼并不多,一個(gè)字節(jié)可以表示所有字符了,所以ASCII(American national Standard Code for Information Interchange,美國(guó)國(guó)家標(biāo)準(zhǔn)信息交換碼)編碼就成為美國(guó)人的標(biāo)準(zhǔn)編碼。ASCLL碼雖然并須全面,但在所有字符集中,最知名的可能要數(shù)被稱為ASCII的8位字符集了。
Unicode編碼的由來(lái):
我們都知道中文的字符肯定不止256個(gè)漢字,使用ASCII編碼來(lái)處理中文顯然是不夠的,所以中國(guó)制定了GB2312編碼,用兩個(gè)字節(jié)表示一個(gè)漢字,碰到及其特殊的情況,還會(huì)用三個(gè)字節(jié)來(lái)表示一個(gè)漢字。GB2312還把ASCII包含進(jìn)去了。同理,日文,韓文等上百個(gè)國(guó)家為了解決這個(gè)問(wèn)題發(fā)展了一套自己的編碼,于是乎標(biāo)準(zhǔn)越來(lái)越多,如果出現(xiàn)多種語(yǔ)言混合顯示就一定會(huì)出現(xiàn)亂碼。那么針對(duì)這種編碼“亂象”,Unicode便應(yīng)運(yùn)而生了,其將所有語(yǔ)言統(tǒng)一到一套編碼規(guī)則里。
Unicode編碼的問(wèn)題:
ASCII編碼是1個(gè)字節(jié),而Unicode編碼通常是2個(gè)字節(jié)。
字母A用ASCII編碼是十進(jìn)制的65,二進(jìn)制的01000001;
字符0用ASCII編碼是十進(jìn)制的48,二進(jìn)制的00110000,注意字符’0’和整數(shù)0是不同的;
漢字中已經(jīng)超出了ASCII編碼的范圍,用Unicode編碼是十進(jìn)制的20013,二進(jìn)制的01001110 00101101。
你可以猜測(cè),如果把ASCII編碼的A用Unicode編碼,只需要在前面補(bǔ)0就可以,因此,A的Unicode編碼是00000000 01000001。
新的問(wèn)題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼,亂碼問(wèn)題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲(chǔ)空間,在存儲(chǔ)和傳輸上就十分不劃算。
正是由于這樣的原因,使得Unicode編碼一時(shí)間很難推廣,于是,為了較好的解決 Unicode 的編碼問(wèn)題, UTF-8 和 UTF-16 應(yīng)運(yùn)而生。
UTF-8
UTF-8 是目前互聯(lián)網(wǎng)上使用最廣泛的一種 Unicode 編碼方式,它的最大特點(diǎn)就是可變長(zhǎng)。它可以使用 1 - 4 個(gè)字節(jié)表示一個(gè)字符,根據(jù)字符的不同變換長(zhǎng)度。UTF-8 的編碼規(guī)則很簡(jiǎn)單,只有二條:
(1)對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的 Unicode 碼。因此對(duì)于英語(yǔ)字母,UTF-8 編碼和 ASCII 碼是相同的。
(2)對(duì)于需要使用 N 個(gè)字節(jié)來(lái)表示的字符(N > 1),第一個(gè)字節(jié)的前 N 位都設(shè)為 1,第 N + 1 位設(shè)為0,剩余的 N - 1 個(gè)字節(jié)的前兩位都設(shè)位 10,剩下的二進(jìn)制位則使用這個(gè)字符的 Unicode 碼點(diǎn)來(lái)填充。
編碼規(guī)則如下
UTF-16
在了解 UTF-16 編碼方式之前,先了解一下另外一個(gè)概念——“平面”。
在上面的介紹中,提到了 Unicode 是一本很厚的字典,她將全世界所有的字符定義在一個(gè)集合里。這么多的字符不是一次性定義的,而是分區(qū)定義。每個(gè)區(qū)可以存放 65536 個(gè)(2^16)字符,稱為一個(gè)平面(plane)。目前,一共有 17 個(gè)(2^5)平面,也就是說(shuō),整個(gè) Unicode 字符集的大小現(xiàn)在是 2^21。
最前面的 65536 個(gè)字符位,稱為基本平面(簡(jiǎn)稱 BMP ),它的碼點(diǎn)范圍是從 0 到 2^16-1,寫成 16 進(jìn)制就是從 U+0000 到 U+FFFF。所有最常見(jiàn)的字符都放在這個(gè)平面,這是 Unicode 最先定義和公布的一個(gè)平面。剩下的字符都放在輔助平面(簡(jiǎn)稱 SMP ),碼點(diǎn)范圍從 U+010000 到 U+10FFFF。
接下來(lái)我們?cè)僬刄TF-16,UTF-16編碼采用了不同長(zhǎng)度的編碼表示所有的Unicode碼點(diǎn)。在基本的多語(yǔ)言級(jí)別中,每個(gè)字符用16位表示,通常被稱為代碼單元;而輔助字符采用一對(duì)連續(xù)的代碼單元進(jìn)行編碼。這樣構(gòu)成的編碼值一定落入基本的多語(yǔ)言級(jí)別中空閑的2048字節(jié)內(nèi),通常被稱為替代區(qū)域(surrogate area)[U+D800–U+DBFF用于第一個(gè)代碼單元,U+DC00–U+DFFF用于第二個(gè)代碼單元]。這樣設(shè)計(jì)十分巧妙,我們可以迅速地知道一個(gè)代碼單元是一個(gè)字符的編碼,還是一個(gè)輔助字符的第一或第二部分。
在Java中,char類型用UTF-16編碼描述一個(gè)代碼單元。所以在Java編程中強(qiáng)烈建議不要使用char類型,除非確實(shí)需要對(duì)UTF-16代碼單元操作。最好將需要處理的字符串用抽象數(shù)據(jù)類型表示。
Unicode編碼與文字處理
在文字處理方面,Unicode為每一個(gè)字符而非字形定義唯一的代碼(即一個(gè)整數(shù))。換句話說(shuō),統(tǒng)一碼以一種抽象的方式(即數(shù)字)來(lái)處理字符,并將視覺(jué)上的演繹工作(例如字體大小、外觀形狀、字體形態(tài)、文體等)留給其他軟件來(lái)處理,例如網(wǎng)頁(yè)瀏覽器或是文字處理器。
總結(jié)
以上是生活随笔為你收集整理的Unicode编码详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vue3---安装axios
- 下一篇: itextpdf table使用