女人夜夜春高潮爽A∨片传媒_国产精品VIDEOS麻豆_在线精品亚洲一区二区三区_亚洲熟妇无码av

編程代碼
新聞詳情

萬字長文講解編碼知識,看這文就夠了!(一)

發布時間(jian):2020-05-31 09:58:33 最后更新:2020-11-23 14:37:09 瀏覽次數(shu):3532
萬字長文講解編碼知識,看這文就夠了!| 原力計劃


基(ji)礎概念

1、字符

字(zi)(zi)符(fu)(fu)(fu)指類(lei)字(zi)(zi)形(xing)單位或符(fu)(fu)(fu)號,包(bao)括字(zi)(zi)母、數字(zi)(zi)、運算符(fu)(fu)(fu)號、標(biao)點符(fu)(fu)(fu)號和其他符(fu)(fu)(fu)號,以及一些功(gong)能性符(fu)(fu)(fu)號。一般來說我們稱某(mou)個(ge)字(zi)(zi)符(fu)(fu)(fu)集里(li)面的(de)字(zi)(zi)符(fu)(fu)(fu),叫xx字(zi)(zi)符(fu)(fu)(fu),如ASCII字(zi)(zi)符(fu)(fu)(fu)集里(li)面的(de)ASCII字(zi)(zi)符(fu)(fu)(fu),GB2312字(zi)(zi)符(fu)(fu)(fu)集里(li)面的(de)GB2312字(zi)(zi)符(fu)(fu)(fu)。

2、字符集

字符集(Character Set、Charset),字面上的理解就是字符的集合,是一個自然語言文字系統支持的所有字符的集合。字符是各種文字和符號的總稱,包括文字、數字、字母、音節、標點符號、圖形符號等。例如ASCII字符集,定義了128個字符;GB2312字符集定義了7445個字符。而字(zi)(zi)符集(ji)準(zhun)確地來說(shuo),指的是已編號的字(zi)(zi)符的有序集(ji)合(he)(但不一定(ding)是(shi)連(lian)續的(de),后(hou)文有詳細介(jie)紹)。

常見字(zi)符(fu)集名(ming)稱:ASCII字(zi)符(fu)集、GB2312字(zi)符(fu)集、BIG5字(zi)符(fu)集、 GB18030字(zi)符(fu)集、Unicode字(zi)符(fu)集等。

3、碼位

在字(zi)符編碼(ma)(ma)術語中,碼(ma)(ma)位(wei)(code point)或稱編碼(ma)(ma)位(wei)置、碼(ma)(ma)點,是(shi)組成碼(ma)(ma)空間(或代(dai)碼(ma)(ma)頁)的數值。例如,ASCII碼(ma)(ma)包(bao)含128個碼(ma)(ma)位(wei),范圍是(shi)016進制到7F16進制,擴(kuo)展ASCII碼(ma)(ma)包(bao)含256個碼(ma)(ma)位(wei),范圍是(shi)016進制到FF16進制,而Unicode包(bao)含1,114,112個碼(ma)(ma)位(wei),范圍是(shi)016進制到10FFFF16進制。Unicode碼(ma)(ma)空間劃分為17個Unicode字(zi)符平(ping)面(基本多文種平(ping)面,16個輔助平(ping)面),每個平(ping)面有65,536(= 216)個碼(ma)(ma)位(wei)。因此Unicode碼(ma)(ma)空間總計(ji)是(shi)17 × 65,536 = 1,114,112. —解(jie)釋(shi)來源于維基百科(ke)。

4、字(zi)符(fu)編碼

字(zi)(zi)(zi)符(fu)(fu)(fu)編(bian)碼(Character Encoding),是把(ba)字(zi)(zi)(zi)符(fu)(fu)(fu)集中的(de)字(zi)(zi)(zi)符(fu)(fu)(fu)按一定方式編(bian)碼為某(mou)指(zhi)定集合(he)(he)中的(de)某(mou)一對象的(de)過(guo)(guo)程(cheng)(cheng)(比如將(jiang)字(zi)(zi)(zi)符(fu)(fu)(fu)編(bian)碼為由0和1兩(liang)個數(shu)字(zi)(zi)(zi)所組(zu)成的(de)位串模式、由0~9十個數(shu)字(zi)(zi)(zi)所組(zu)成的(de)自然數(shu)序列或電(dian)脈沖等(deng)),亦即(ji)在字(zi)(zi)(zi)符(fu)(fu)(fu)集與(yu)指(zhi)定集合(he)(he)兩(liang)者(zhe)之間(jian)建立一個對應關系(即(ji)映(ying)射關系)的(de)過(guo)(guo)程(cheng)(cheng)。這是信(xin)息處理的(de)一項基礎技(ji)術(shu)。常見的(de)例子包括將(jiang)拉丁字(zi)(zi)(zi)母表編(bian)碼成摩斯電(dian)碼和ASCII碼。

PS:這里我們計算機這里字符(fu)編(bian)碼(ma)肯定(ding)是(shi)用二進制來編(bian)碼(ma)的(de)。

看(kan)完(wan)這四(si)個概念(nian),你應該要明白,它(ta)們之間的關(guan)系,以ASCII為例,下圖解釋它(ta)們之間關(guan)系。

萬字長文講解編碼知識,看這文就夠了!| 原力計劃

這里細說一下,碼位就是這個字符集里面字符的一個表示位置,通俗來說,碼位就是一般跟字符集綁在一起,字符編碼是把字符集中的字符編碼為特定的二進制數,以便在計算機中存(cun)儲。這個二進制數就叫xx碼。

字符集(ji)編碼(ma)分類總結

在說字符(fu)集編(bian)(bian)碼之前,先明確一個(ge)觀點,字符(fu)集編(bian)(bian)碼與字符(fu)集是兩(liang)個(ge)不同層面(mian)的概念:

(1)charset 是character set 的(de)簡寫,即(ji)字符(fu)集。

(2)encoding 是 charsetencoding 的(de)簡寫,即字符集編碼,簡稱編碼。

萬字長文講解編碼知識,看這文就夠了!| 原力計劃

1、ASCII編碼

ASCII(美國信息交換標準代碼)是基于拉丁字母(就是我們現在的英文字母)的一套電腦編碼系統。它主要用于顯示現代英語,而其擴展版本延伸美國標準信息交換碼則可以部分支持其他西歐語言,并等同于國際標準ISO/IEC 646

ASCII由電報碼發展而來。第一版標準發布于1963年,1967年經歷了一次主要修訂,最后一次更新則是在1986年,至今為止共定義了128個字符;其中33個(ge)字符無法顯示(一些終端提(ti)供了(le)擴展,使得這(zhe)些字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)可(ke)顯(xian)示(shi)為(wei)諸如笑臉、撲克牌花式等8-bit符(fu)(fu)(fu)(fu)(fu)號),且這(zhe)33個(ge)字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)多數都已是陳廢的(de)控(kong)制字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)。控(kong)制字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)的(de)用途主(zhu)要是用來(lai)操控(kong)已經處理過的(de)文字(zi)(zi)(zi)(zi)。在33個(ge)字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)之(zhi)外的(de)是95個(ge)可(ke)顯(xian)示(shi)的(de)字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)。用鍵盤敲下(xia)空白(bai)鍵所產生的(de)空白(bai)字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)也算1個(ge)可(ke)顯(xian)示(shi)字(zi)(zi)(zi)(zi)符(fu)(fu)(fu)(fu)(fu)(顯(xian)示(shi)為(wei)空白(bai))。

每個ASCII字(zi)符占用1個字(zi)節(jie)(8bits),共(gong)有128位字符(fu)(fu)或符(fu)(fu)號(hao),使(shi)(shi)用7位二(er)進(jin)制數(shu)(剩下的1位二(er)進(jin)制為0,即高位為0)來表示所(suo)有的大寫和(he)小寫字母(mu),數(shu)字0 到(dao)9、標點符(fu)(fu)號(hao),以及在美(mei)式英(ying)語中使(shi)(shi)用的特(te)殊(shu)控制字符(fu)(fu)。

缺點:ASCII的最大缺點是只能顯示26個基本拉丁字母、阿拉伯數目字和英式標點符號,因此只能用于顯示現代美國英語(而且在處理英語當中的外來詞如na?ve、café、élite等等時,所有重音符號都不得不去掉,即使這樣做會違反拼寫規則)。而EASCII(即(ji)擴展的(de)ASCII碼,利用(yong)8位的(de)高位設為(wei)1進(jin)行擴展)雖(sui)然解決了部分(fen)西歐語(yu)言(yan)的顯示問題,但對更多(duo)其他語(yu)言(yan)依(yi)然無能為力。因此(ci)現在的操作系統(tong)內碼(ma)(稍后會講)基本已經拋棄ASCII碼(ma)而轉用(yong)Unicode碼(ma)。

ASCII碼(ma)表 ://www.asciitable.com

2、GB2312編(bian)碼(ma)

前面可以看到ASCII碼即使進行了擴展也能表示的字符也很少,尤其是當需要計算機顯示存儲中文的時候,就需要一種對中文進行編碼的字符集,GB 2312就是解決中文編碼的字符集,由國家標準委員會發布。那個時候當中國人們得到計算機時,已經沒有可以利用的字節狀態來表示漢字,況且有6000多個常用漢字需要保存,于是想到把那些ASCII碼中127號之后的奇異符號們直接取消掉, 規定:一(yi)個小(xiao)于127的(de)(de)字(zi)(zi)符的(de)(de)意義與原來相(xiang)同,但兩個大于127的(de)(de)字(zi)(zi)符連在一(yi)起時,就表(biao)示一(yi)個漢字(zi)(zi),前面的一個字節(稱之為高字節)從0xA1用到0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些(xie)編碼里,我們還把(ba)數學(xue)符(fu)號、羅馬(ma)希臘的(de)(de)(de)字(zi)母、日文(wen)的(de)(de)(de)假名(ming)們都(dou)編進去了,連在 ASCII 里本來就(jiu)有的(de)(de)(de)數字(zi)、標點、字(zi)母都(dou)統統重新(xin)編了兩(liang)個字(zi)節長的(de)(de)(de)編碼,這就是常說的"全角"字符(fu),而原來在127號以下的那些就叫"半角"字符了。這種漢字方案叫做 “GB2312”。GB2312 是對(dui)ASCII 的中(zhong)文擴展。兼容ASCII。

萬字長文講解編碼知識,看這文就夠了!| 原力計劃

這(zhe)里的(de)(de)(de)A GB2312碼是(shi)(shi)(shi)0xA3C1,0xA3和0xC1都是(shi)(shi)(shi)高(gao)于127的(de)(de)(de),所以判斷它是(shi)(shi)(shi)個(ge)(ge)全(quan)角(jiao)字符(fu),另外我們可(ke)以觀(guan)察到所有的(de)(de)(de)GB2312編碼表(biao)中的(de)(de)(de)GB2312碼每個(ge)(ge)字節都是(shi)(shi)(shi)大于0xA0的(de)(de)(de),這(zhe)個(ge)(ge)就是(shi)(shi)(shi)為了(le)保(bao)證能區分(fen)是(shi)(shi)(shi)否為ASCII碼,小于127的(de)(de)(de)字節就按照ASCII碼標準,碰到連續(xu)兩個(ge)(ge)大于127字節就組合成(cheng)一個(ge)(ge)GB2312碼。

GB2312漢字編碼字符集對照表:
//tools.jb51.net/table/gb2312

3、GBK編碼(ma)

但是中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這里打出來,不得不繼續把 GB2312 沒有用到的碼位找出來用上。后來還是不夠用,于是干脆不(bu)再要(yao)求低字(zi)節一定是(shi)(shi)(shi)127號(hao)之后的(de)內碼(ma),只要(yao)第一個字(zi)節是(shi)(shi)(shi)大于127就固定表示這是(shi)(shi)(shi)一個漢字(zi)的(de)開始,不(bu)管后面跟的(de)是(shi)(shi)(shi)不(bu)是(shi)(shi)(shi)擴(kuo)展字(zi)符集里的(de)內容。結果擴展之后的編碼方案被稱為 “GBK” 標準,GBK 包括了(le)(le)GB2312 的所有內容,同時又增加(jia)了(le)(le)近(jin)20000個新的漢字(包括繁體字)和符號(hao)

4、GB18030編碼

后來(lai)中國的少數民族也(ye)要用電腦了(le)(le),GBK的兩(liang)萬多(duo)字也(ye)已經(jing)無法(fa)(fa)滿(man)足(zu)我們的需(xu)(xu)求(qiu)了(le)(le),還(huan)有更(geng)多(duo)可能你(ni)自己從來(lai)沒見過的漢字需(xu)(xu)要編(bian)碼。這時(shi)候(hou)顯(xian)然(ran)只用2bytes表示一(yi)個(ge)字已經(jing)不夠用了(le)(le)(2byte最多(duo)只有65536種(zhong)(zhong)組合(he)(he),然(ran)而為(wei)了(le)(le)和ASCII兼容,最高位(wei)不能為(wei)0就已經(jing)直接淘汰了(le)(le)一(yi)半的組合(he)(he),只剩下3萬多(duo)種(zhong)(zhong)組合(he)(he)無法(fa)(fa)滿(man)足(zu)全部漢字要求(qiu))。因(yin)此(ci)GB18030多(duo)出來(lai)的漢字使用4byte編(bian)碼。

當然(ran),為了兼(jian)容GBK,這個(ge)四字節(jie)的前兩位顯然(ran)不能與GBK沖(chong)突(實操中(zhong)發現后兩位也并沒有和GBK沖(chong)突)。通過多(duo)年的發展至此,GB18030編碼(ma)的中(zhong)文(wen)文(wen)件已經(jing)有七萬多(duo)個(ge)漢字了。

GB18030包含三種長度的編碼:單字節的ASCII、雙字節的GBK(略帶擴展)、以及用于填補所有Unicode碼位的四字節UTF區塊。所以我(wo)們說(shuo)GB18030采用多字(zi)節編碼,每個(ge)字(zi)符可以由 1 個(ge)、2 個(ge)或 4 個(ge)字(zi)節組成

其實我們用(yong)到的(de)(de)99%以(yi)(yi)上的(de)(de)漢字,都在(zai)GB2312那一塊(kuai)區域內。在(zai)實際使用(yong)中,GBK編(bian)(bian)(bian)碼(ma)已經(jing)可以(yi)(yi)滿足大(da)部分場景(jing)了,GB18030編(bian)(bian)(bian)碼(ma)中所有漢字都是(shi)我們這輩子都不一定(ding)能見到的(de)(de)文字,所以(yi)(yi)平時經(jing)常會使用(yong)的(de)(de)就是(shi)GBK編(bian)(bian)(bian)碼(ma)。

這里額外總結一(yi)下這四個兼(jian)(jian)容(rong)性關系是GB18030兼(jian)(jian)容(rong)GBK,GBK兼(jian)(jian)容(rong)GB2312,GB2312兼(jian)(jian)容(rong)ASCII。所(suo)謂兼(jian)(jian)容(rong),你(ni)可以(yi)簡單理解為子集、不沖(chong)突的關系。

例如GB2312編碼的文件中(zhong)可以(yi)出現ASCII字(zi)符,GBK編碼的文件中(zhong)可以(yi)出現GB2312和ASCII字(zi)符,GB18030編碼的文件可以(yi)出現GBK、GB2312、ASCII字(zi)符。

5、Unicode

友情(qing)建議:看Unicode一些(xie)概(gai)念(nian)解釋和(he)歷史(shi)時,建議看維基百科,而且是(shi)英文(wen)版(ban)的,別(bie)用(yong)中文(wen)版(ban),有些(xie)地方講的模棱(leng)兩(liang)可,容易陷入盲區。

Unicode(中(zhong)文:萬國碼(ma)、國際碼(ma)、統一碼(ma)、單一碼(ma))(全(quan)稱Universal Multiple-Octet Coded Character Set)它伴隨著通用字符(fu)集(英語:Universal Character Set, UCS)的標準而(er)發展(zhan)。所以可(ke)以看出他是(shi)字符(fu)集。

(1)Unicode與 ISO 10646

全世界很多(duo)個(ge)國家都在為自己(ji)的文字編(bian)碼,并且(qie)互不相通,不同(tong)的語言字符(fu)編(bian)碼值相同(tong)卻(que)代表不同(tong)的符(fu)號(例如(ru):韓(han)文編(bian)碼EUC-KR中“???”的編(bian)碼值正(zheng)好是漢(han)字編(bian)碼GBK中的“茄(qie)憊絹”)。

因此,同一份文檔,拷貝至不同語言的機器,就可能成了亂碼,于是人們就想:我(wo)們(men)能(neng)不能(neng)定義(yi)一個超大的字符(fu)(fu)集(ji),它可以容(rong)納(na)全(quan)世界(jie)所有的文(wen)字字符(fu)(fu),再對(dui)它們(men)統(tong)一進行(xing)編(bian)碼(ma)(ma),讓每一個字符(fu)(fu)都對(dui)應一個不同的編(bian)碼(ma)(ma)值,從而就不會再有亂(luan)碼(ma)(ma)了

如果說“各個(ge)國家都在為(wei)自(zi)己(ji)文(wen)字獨立編碼”是(shi)(shi)百家爭鳴,那么“建立世(shi)界統一(yi)的字符編碼”則是(shi)(shi)一(yi)統江湖,誰都想來做這(zhe)個(ge)武林盟主。早前就有兩個(ge)機構做了這(zhe)個(ge)事:

  • 國際標準(zhun)化組織(ISO),他(ta)們于1984年創建(jian)ISO/IEC JTC1/SC2/WG2工作組,試圖制(zhi)定(ding)一份“通用字符集”(Universal Character Set,簡稱UCS),并最終制(zhi)定(ding)了ISO 10646標準(zhun)。(簡單來說ISO 10646標準(zhun)就是UCS)

  • 統(tong)一碼聯盟,他們由(you)Xerox、Apple等軟件制造商于(yu)1988年組成,并且(qie)開發了Unicode標準(The Unicode Standard,這個前綴(zhui)Uni很(hen)牛(niu)逼哦—Unique, Universal, and Uniform)。

Unicode與(yu)ISO 10646標準的風風雨雨:

在1984年,喜歡以繁多的編號糊弄群眾的國際標準化組織ISO也開始著手制定解決不同語言字符數量太大問題的解決方案,這一方(fang)案被稱為Universal Character Set(UCS),正式的(de)編號是(shi)ISO-10646(記(ji)得(de)么,ASCII是(shi)ISO-646,不知這(zhe)種(zhong)安排是(shi)否是(shi)故意(yi)的(de))。

還(huan)是ISO高瞻遠矚,一(yi)開始就確定了(le)UCS是一(yi)個(ge)31位的(de)(de)編(bian)碼字(zi)符(fu)集(即用(yong)一(yi)個(ge)大小不超過2的(de)(de)31次(ci)方的(de)(de)整數數字(zi)為每個(ge)字(zi)符(fu)編(bian)號(hao)),這回(hui)真的(de)(de)足以容納古往今來所有國(guo)家,所有語言所包含的(de)(de)字(zi)符(fu)了(le)(是的(de)(de),任(ren)何(he)國(guo)家,任(ren)何(he)小語種都包括)。雖然后(hou)來他們意識到(dao),2的(de)(de)31次(ci)方個(ge)碼位又實在太多(duo)了(le)……

天下大(da)勢,分久必合(he)。無論(lun)Unicode還是(shi)UCS,最(zui)初的(de)(de)(de)目的(de)(de)(de)都(dou)是(shi)杜(du)絕(jue)各種各樣(yang)名目繁多(duo)形式各異互不(bu)兼容老死不(bu)相往來(lai)的(de)(de)(de)私用擴(kuo)展編碼(好(hao)啰嗦的(de)(de)(de)一(yi)句話),結果兩方確(que)立標(biao)準(zhun)的(de)(de)(de)同時(最(zui)初時這兩個(ge)(ge)標(biao)準(zhun)是(shi)不(bu)兼容的(de)(de)(de)),因(yin)為都(dou)是(shi)個(ge)(ge)干(gan)個(ge)(ge)的(de)(de)(de),肯定不(bu)可能一(yi)模一(yi)樣(yang),出現標(biao)準(zhun)不(bu)同。

1991年,Unicode聯盟(meng)與ISO的(de)工(gong)作組終于開(kai)始討(tao)論Unicode與UCS的(de)合(he)并(bing)問(wen)題,雖然其后的(de)合(he)并(bing)進行了很(hen)多年,Unicode初版規范中的(de)很(hen)多編碼(ma)都需要(yao)(yao)被(bei)改寫,UCS也需要(yao)(yao)對碼(ma)空間的(de)使用進行必要(yao)(yao)限制,但成果是(shi)喜(xi)人的(de)。

最終,兩(liang)者統一了(le)抽象字(zi)符(fu)集(即任何一個(ge)在(zai)Unicode中(zhong)存在(zai)的(de)(de)(de)(de)字(zi)符(fu),在(zai)UCS中(zhong)也存在(zai)),且最靠前的(de)(de)(de)(de)65535個(ge)字(zi)符(fu)也統一了(le)字(zi)符(fu)的(de)(de)(de)(de)編(bian)碼(ma)。對于碼(ma)空間(jian)(jian),兩(liang)者同(tong)意以(yi)(yi)一百一十(shi)萬(wan)(wan)為限(即兩(liang)者都認為雖然65536不夠,但2的(de)(de)(de)(de)31次方又太大,一百一十(shi)萬(wan)(wan)是個(ge)雙方都可接受的(de)(de)(de)(de)碼(ma)空間(jian)(jian)大小,也夠用(yong),當然,這里說的(de)(de)(de)(de)一百一十(shi)萬(wan)(wan)只是個(ge)約數),Unicode將碼(ma)空間(jian)(jian)擴展到了(le)一百一十(shi)萬(wan)(wan),而UCS將永久性(xing)的(de)(de)(de)(de)不使(shi)用(yong)一百一十(shi)萬(wan)(wan)以(yi)(yi)后的(de)(de)(de)(de)碼(ma)位(wei)。

也(ye)(ye)就是(shi)(shi)說,現在(zai)再講(jiang)Unicode只(zhi)包含65536個字(zi)符是(shi)(shi)不(bu)對(dui)的(雖然大(da)家現在(zai)都(dou)(dou)知道Unicode至(zhi)少(shao)都(dou)(dou)可以囊括幾億個字(zi)符)。除了對(dui)已(yi)經(jing)(jing)定(ding)義(yi)的字(zi)符進行統(tong)一外,Unicode聯盟與ISO工作(zuo)(zuo)組也(ye)(ye)同意今后任何(he)的擴展工作(zuo)(zuo)兩者均(jun)保持同步,因此雖然從歷史的意義(yi)上講(jiang)Unicode與UCS不(bu)是(shi)(shi)一回事(shi)(甚至(zhi)細節上說也(ye)(ye)不(bu)是(shi)(shi)一回事(shi)),但現在(zai)提起Unicode,指(zhi)代(dai)兩者均(jun)無不(bu)妥(tuo),畢(bi)竟因為已(yi)經(jing)(jing)統(tong)一了。

(現(xian)在網上基本(ben)上把Unicode字符集叫做UCS,Unicoide的全稱是 Universal Multiple-Octet Coded Character Set簡寫也(ye)是UCS,一看也(ye)對上了(le),害,只(zhi)能(neng)說天(tian)注定)。

現在Unicode編碼點分(fen)為17個平面(mian)(plane),每個平面(mian)包含216(即65536)個碼位(codepoint)。17個平面(mian)的碼位可表示為從U+xx0000到(dao)U+xxFFFF,其中xx表示十六進制值從0016到(dao)1016,共(gong)計17個平面(mian)。

這第一個位(wei)置(當(dang)xx是00的(de)時候)被稱為BMP(基本(ben)多文種(zhong)平面(mian),BasicMultilingualPlane)。它包含了最常用的(de)碼位(wei)從U+0000到U+FFFF(常見的(de)65536個字符(fu))。

其余16個平面(mian)(從下面(mian)的(de)(de)1號(hao)平面(mian)到16號(hao)平面(mian)),你可以叫做非(fei)BMP,由此這樣(yang)分(fen)的(de)(de)話里面(mian)的(de)(de)字符(fu)就有兩個概念:BMP字符(fu)和非(fei)BMP字符(fu),后者也被稱為補(bu)充字符(fu)。(偷(tou)偷(tou)告訴你們,大(da)家(jia)喜聞樂見的(de)(de)Emoji表情都是在1號(hao)平面(mian),范(fan)圍(wei)是U+1F600-U+1F64F)

萬字長文講解編碼知識,看這文就夠了!| 原力計劃

(2)UCS-2和(he)UCS-4

ISO10646標準為“通用字符集”(UCS)定義了一種16位的(de)編碼(ma)形式(即UCS-2)UCS-2全稱Universal Character Set coded in 2octets,從英文上(shang)就可(ke)以(yi)(yi)看出(chu)含(han)義,以(yi)(yi)2字(zi)節(jie)編碼(ma)的通用(yong)字(zi)符集編碼(ma),固定占用(yong)2個字(zi)節(jie),它包含(han)65536個編碼(ma)空間(可(ke)以(yi)(yi)為(wei)全世界最常用(yong)的63K字(zi)符編碼(ma),為(wei)了兼容Unicode,0xD800-0xDFFF之間的碼(ma)位未使用(yong))。

例:“漢”的UCS-2編碼為6C49。除此之外ISO10646標準為“通用字符集”(UCS)還定義了一種31位的編碼形式(即UCS-4),UCS-4全稱(cheng)UniversalCharacter Set coded in 4 octets,其編碼(ma)固定(ding)占用(yong)4個(ge)字(zi)節,編碼(ma)空間為0x00000000 ~0x7FFFFFFF(可(ke)以編碼(ma)20多億個(ge)字(zi)符)。

隨著Unicode與ISO 10646合并(bing)統一,Unicode就用UCS通(tong)用字(zi)符集標(biao)準,早(zao)期(qi)的(de)(de) Unicode 編碼實現(xian)也就采用了UCS-2和UCS-4。(準確來說是(shi)UCS-2,UCS-4基本上(shang)是(shi)理論,沒付諸實際,畢(bi)竟(jing)早(zao)期(qi)65536個(ge)(ge)字(zi)符已經夠用了,我兩個(ge)(ge)字(zi)節(jie)編碼能(neng)實現(xian)的(de)(de)事,腦(nao)子笨的(de)(de)人(ren)才會用四個(ge)(ge)字(zi)節(jie)實現(xian),你以為(wei)存儲和帶(dai)寬有多的(de)(de))。

萬字長文講解編碼知識,看這文就夠了!| 原力計劃

這里編碼最多也就存在UCS-2(big Endian和(he)LittleEndian先不管(guan),后面會(hui)講(jiang))。

Unicode字符集只規定了碼點和文字之間的對應關系,并沒有規定碼點在計算機中如何存儲。UCS-2和(he)UCS-4就規定了具體的(de)實(shi)現(xian)(xian),后來(lai)改進演變(bian)為了UTF-16, UTF-32。然后又創造(zao)了一種(zhong)全新的(de)簡單粗暴(bao)好用的(de)變(bian)長編碼UTF-8,于是乎(hu)這(zhe)三哥(ge)們(men)就形成了現(xian)(xian)代Unicode字符集編碼實(shi)現(xian)(xian)的(de)三劍客。

(3)UTF-16與(yu)UTF-32

Unicode與ISO 10646合并統一后,Unicode與 ISO 10646 的通用字符集概念(UCS)相對應。早期實現Unicode用的(de)編碼是UCS-2,后來隨著發(fa)展發(fa)現 216(即65536)個(ge)字(zi)符不(bu)能(neng)滿足了,Unicode標準本身發(fa)生了變化(hua):65536個(ge)字(zi)符顯得不(bu)足,引入了更大的31位空間和一個(ge)編碼(UCS-4),每個(ge)字(zi)符需要4個(ge)字(zi)節。

但(dan)是統(tong)一(yi)碼聯盟對(dui)此(ci)予以抵制(zhi)(這(zhe)(zhe)就是為(wei)什么(me)我之前(qian)說UCS-4是一(yi)種理論編碼,根本就沒付諸實(shi)際),這(zhe)(zhe)是因(yin)為(wei)每(mei)個字符4個字節(jie)浪費了(le)很多磁盤空(kong)間和內存(cun),并且因(yin)為(wei)一(yi)些制(zhi)造商已經在每(mei)個字符2個字節(jie)的(de)技術上投入了(le)大(da)量資(zi)金。所以最后通(tong)過一(yi)系列巴(ba)拉(la)巴(ba)拉(la)討論規(gui)定(ding)形成了(le)一(yi)種折衷方案(an),建立了(le)UTF-16編碼方案(an)(此(ci)時Unicode標(biao)準2.0),它(ta)替(ti)代了(le)原有的(de)UCS-2,并做了(le)改進。

它與UCS-2一樣,它使用(yong)(yong)兩個字節為(wei)(wei)全世界最常用(yong)(yong)的(de)63K字符(fu)編(bian)碼(ma),不同(tong)的(de)是,它使用(yong)(yong)4個字節對(dui)不常用(yong)(yong)的(de)字符(fu)進行編(bian)碼(ma)。目的(de)就是為(wei)(wei)了(le)支(zhi)持從17個平面編(bian)碼(ma)1,112,064個代(dai)碼(ma)點。

UTF-16屬(shu)于變長編(bian)碼(ma)。我們可以將UTF-16編(bian)碼(ma)看成是UCS-2編(bian)碼(ma)父集。在沒有輔(fu)助(zhu)(zhu)平(ping)面字(zi)符(fu)(surrogate code points)前(qian),UTF-16與UCS-2所指的是同一意(yi)思。但(dan)當(dang)引入輔(fu)助(zhu)(zhu)平(ping)面字(zi)符(fu)后(hou),就(jiu)稱(cheng)為UTF-16了。

現在應該認為UCS-2已(yi)作廢(fei),如(ru)果有人還用這種,也不必(bi)糾結(jie),它就是表達(da)用定長(chang)2字節編碼,自己心里(li)清楚就行(基(ji)本上你查維基(ji)百科上UCS-2都是重定向(xiang)到UTF-16)。

另外當(dang)時ISO 10646的(de)UCS-4編(bian)碼(ma)并入了(le)Unicode標(biao)準,而UCS-4有20多億(yi)個編(bian)碼(ma)空間,但實際使用范圍并不超(chao)過0x10FFFF,并且為了(le)兼(jian)容Unicode標(biao)準,ISO也承諾將不會為超(chao)出0x10FFFF的(de)UCS-4編(bian)碼(ma)賦值。

由此提出了實實在在的UTF-32編碼(現在也應該認為UCS-4像UCS-2一樣作廢,維基百科上UCS-4也重定向到UTF-32頁面),它的編碼值與UCS-4相同,只不過其編碼空間被限定在了0~0x10FFFF之間。因此也可以說:UTF-32是UCS-4的一個子集(ji)。

(現在若有軟件聲稱自(zi)己支持(chi)UCS-2,那其實是暗指它不能支持(chi)在UTF-16中超過2字節的字集(ji)。)

UTF-16(16 位(wei) Unicode轉換格式)是(shi)(shi)一(yi)種字符編碼(ma),能(neng)夠對Unicode的(de)所(suo)有1,112,064個(ge)(ge)(ge)有效碼(ma)點進行編碼(ma)(實(shi)際上,此(ci)代碼(ma)點數(shu)由UTF-16的(de)設計決定(ding),這個(ge)(ge)(ge)你(ni)細品你(ni)就知道(dao)什么意思,就好(hao)像(xiang)某個(ge)(ge)(ge)班(ban)有55個(ge)(ge)(ge)人,根據55個(ge)(ge)(ge)座(zuo)位(wei)確定(ding)55個(ge)(ge)(ge)人,而55個(ge)(ge)(ge)座(zuo)位(wei)這個(ge)(ge)(ge)多少是(shi)(shi)由55個(ge)(ge)(ge)人決定(ding)的(de),兩(liang)者是(shi)(shi)相互的(de),這是(shi)(shi)一(yi)個(ge)(ge)(ge)哲學道(dao)理,hh扯遠了,所(suo)以其中意味(wei)自行明(ming)白(bai))。

前面(mian)(mian)提(ti)到過:Unicode編碼(ma)點分(fen)為(wei)(wei)17個平(ping)(ping)面(mian)(mian)(plane),每個平(ping)(ping)面(mian)(mian)包(bao)含216(即(ji)65536)個碼(ma)位(codepoint),而第一個平(ping)(ping)面(mian)(mian)稱(cheng)為(wei)(wei)“基本(ben)多語言(yan)平(ping)(ping)面(mian)(mian)”(Basic Multilingual Plane,簡稱(cheng)BMP),其余平(ping)(ping)面(mian)(mian)稱(cheng)為(wei)(wei)“輔助(zhu)平(ping)(ping)面(mian)(mian)”(Supplementary Planes)。其中“基本(ben)多語言(yan)平(ping)(ping)面(mian)(mian)”(00xFFFF)中0xD8000xDFFF之間的碼(ma)位作為(wei)(wei)保留,未使用。

UCS-2只(zhi)能編(bian)碼(ma)“基本(ben)多語言平面”中的(de)字符,此時UTF-16與(yu)UCS-2的(de)編(bian)碼(ma)一樣(都直接使用Unicode的(de)碼(ma)位作(zuo)為編(bian)碼(ma)值),例(li):“漢”在Unicode中的(de)碼(ma)位為6C49,而在UTF-16編(bian)碼(ma)也(ye)為6C49。

另外,UTF-16還可以(yi)利用(yong)保留(liu)下來(lai)的(de)(de)0xD800-0xDFFF區段的(de)(de)碼(ma)(ma)(ma)位(wei)來(lai)對“輔助平面”的(de)(de)字符的(de)(de)碼(ma)(ma)(ma)位(wei)進(jin)行編(bian)碼(ma)(ma)(ma),因此UTF-16可以(yi)為Unicode中所有的(de)(de)字符編(bian)碼(ma)(ma)(ma)。

UTF-16和UTF-32也(ye)就(jiu)是(shi)如今Unicode編碼(ma)(ma)的標準(zhun)之二,他們(men)的區別就(jiu)是(shi)UTF-16是(shi)變(bian)長編碼(ma)(ma),大部分是(shi)2字節和少部分4字節,UTF-32是(shi)定(ding)長編碼(ma)(ma),表示(shi)任何字符都用 4 字節

在線客(ke)服(fu)
客服電話
  • 0755-23712116
  • 13310869691