成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

細(xì)說(shuō)Unicode(一) Unicode初認(rèn)識(shí)

loostudy / 2881人閱讀

摘要:所以中國(guó)人自己創(chuàng)造了一種字符編碼,每個(gè)漢字和符號(hào)用兩個(gè)字節(jié)來(lái)表示。第一個(gè)字節(jié)稱為高位字節(jié),第二個(gè)字節(jié)稱為低位字節(jié)。而目前為止我們使用最廣泛的中文編碼還是。

網(wǎng)站開(kāi)發(fā)中經(jīng)常會(huì)被亂碼問(wèn)題困擾。知道文件編碼錯(cuò)誤會(huì)導(dǎo)致亂碼,但對(duì)其中的原理卻知之甚少。偶然從某篇文章了解了Unicode,發(fā)現(xiàn)從這條線出發(fā)也牽引出了一系列缺失的知識(shí)點(diǎn)。通過(guò)研讀文章,基本了解了一些以前不明白的問(wèn)題,所以整理了幾篇,從幾個(gè)角度介紹下Unicode, 并聊聊一些相關(guān)的問(wèn)題。

ASCII

上世紀(jì)60年代,美國(guó)人采用了一種編碼來(lái)表示英語(yǔ)以及各種符號(hào),該編碼方式只有一個(gè)字節(jié),能表示256(2^8)個(gè)字符。至今為止才定義了128個(gè)字符。包括33個(gè)控制字符和95個(gè)可顯示字符,這些可顯示字符涵蓋了大小寫英文字母和一些符號(hào),這就是大名鼎鼎的ASCII編碼。

GB 2312

然而隨著計(jì)算機(jī)的發(fā)展,各個(gè)國(guó)家的語(yǔ)言符號(hào)多不勝數(shù),在中國(guó)光中文字符就有7000多個(gè),還不包括繁體中文,ASCII顯然無(wú)法滿足這么多字符編碼需求。所以中國(guó)人自己創(chuàng)造了一種字符編碼,每個(gè)漢字和符號(hào)用兩個(gè)字節(jié)來(lái)表示。第一個(gè)字節(jié)稱為"高位字節(jié)",第二個(gè)字節(jié)稱為"低位字節(jié)"。高位字節(jié)使用了0xA1 - 0xF7, "低位字節(jié)"使用了0xA1 - 0xFE。同時(shí)該編碼方式兼容了ASCII的編碼,對(duì)于小于127的字符即0x00 - 0x7F的字符予以保留。這種編碼方式就是中文編碼GB 2312。

GBK

然而GB 2312能表示的文字也比較有限,對(duì)于一些人名,古漢語(yǔ)和繁體字也無(wú)能為力。所以我們改進(jìn)了GB 2312的編碼方式,擴(kuò)展了GB 2312 中不使用的字節(jié),使其同時(shí)包括了GB2312的所有內(nèi)容,又新增了近20000個(gè)新的漢字,包括繁體字。該編碼就是我們熟悉的GBK。后來(lái)由于又加了少數(shù)名族的文字,又推出了GB18030,用于取代GBK。而目前為止我們使用最廣泛的中文編碼還是GBK。

Unicode

再后來(lái),由于不同的國(guó)家地區(qū)之間都使用不同的編碼,導(dǎo)致計(jì)算機(jī)文件的讀取都需要安裝不同的解碼軟件。經(jīng)常照成文件讀取亂碼。于是有一些組織決定制定出一個(gè)方案,通過(guò)統(tǒng)一的編碼解決這個(gè)難題。于是其中一個(gè)團(tuán)隊(duì)發(fā)明了UCS編碼,還有另一個(gè)團(tuán)隊(duì)發(fā)明了Unicode。后來(lái)兩者達(dá)成一致,只發(fā)布一套字符集,那就是Unicode 。而UCS的碼點(diǎn)將與Unicode保持一致。

Unicode最初規(guī)定用16位的編碼空間,這16位編碼空間稱為統(tǒng)一碼。這樣理論上一共最多有2^16(65536)個(gè)字符。基本滿足各種語(yǔ)言的使用。實(shí)際上當(dāng)前版本的統(tǒng)一碼并未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或?qū)?lái)擴(kuò)展。

目前的Unicode字符分為17組編排,每組稱為一個(gè)平面(Plane),而每平面擁有65536(即2^16)個(gè)碼點(diǎn)。上述16位統(tǒng)一碼字符稱為基本多文種平面(BMP),寫成16進(jìn)制就是從U+0000到U+FFFF。 剩下還有16個(gè)輔助平面(SMP),碼點(diǎn)范圍從U+010000一直到U+10FFFF。這17個(gè)平面結(jié)合起來(lái)至少需要占據(jù)21位的空間(2^16 x 2^5),也就是差不多3個(gè)字節(jié)(24位),而輔助平面實(shí)際上是用4個(gè)字節(jié)表示,方便以后向后擴(kuò)展。

上面講到的幾種編碼都是編碼方式,規(guī)定了從碼點(diǎn)到字符的映射關(guān)系,例如 Unicode中U+0061 對(duì)應(yīng)的就是小寫字母 "a", 我們可以在瀏覽器控制臺(tái)中輸入碼點(diǎn)查找對(duì)應(yīng)的字符:

UTF
Unicode的實(shí)現(xiàn)方式不同于編碼方式。一個(gè)字符的Unicode編碼是確定的。但是在實(shí)際傳輸過(guò)程中,由于不同系統(tǒng)平臺(tái)的設(shè)計(jì)不一定一致,以及出于節(jié)省空間的目的,對(duì)Unicode編碼的實(shí)現(xiàn)方式有所不同。Unicode的實(shí)現(xiàn)方式稱為Unicode轉(zhuǎn)換格式(Unicode Transformation Format,簡(jiǎn)稱為UTF)。

網(wǎng)頁(yè)開(kāi)發(fā)中比較熟悉和常用的編碼實(shí)現(xiàn)是UTF-8。那么這種實(shí)現(xiàn)方式有什么優(yōu)勢(shì)呢?UTF-8是一種變長(zhǎng)的編碼方法。字符長(zhǎng)度從1字節(jié)到4字節(jié)不等。最前面的128個(gè)字符,只使用1個(gè)字節(jié)表示,延續(xù)了ASCII的用法。其他分段的字節(jié)數(shù)如下:

計(jì)算機(jī)在讀取數(shù)據(jù)的時(shí)候都是從高位到地位或從地位到高位。當(dāng)計(jì)算機(jī)讀到一個(gè)3字節(jié)字符時(shí),怎么判斷是輸出1位字符,還是繼續(xù)讀取接下來(lái)的2位并合并為一個(gè)字符呢?這就要涉及到UTF-8的具體實(shí)現(xiàn)了。

UTF-8是這樣做的:

單字節(jié)的字符,字節(jié)的第一位設(shè)為0,對(duì)于英語(yǔ)文本,UTF-8碼只占用一個(gè)字節(jié),和ASCII碼完全相同;

n個(gè)字節(jié)的字符(n>1),第一個(gè)字節(jié)的前n位設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10,這n個(gè)字節(jié)的其余空位填充該字符unicode碼,高位用0補(bǔ)足。

這樣就形成了如下的UTF-8標(biāo)記位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

當(dāng)讀到第一位時(shí),發(fā)現(xiàn)是0開(kāi)頭,就讀一個(gè)字節(jié)。發(fā)現(xiàn)是110,就讀兩個(gè)字節(jié),發(fā)現(xiàn)是1110就讀三個(gè)字節(jié),以此類推,再根據(jù)Unicode規(guī)則找到對(duì)應(yīng)的符號(hào)輸出。這種變長(zhǎng)的編碼方式,能根據(jù)字符采用不同位數(shù)的碼點(diǎn),能夠有效減少文件的體積。

如果采用Unicode的編碼方式直接作為實(shí)現(xiàn)方法。那么每個(gè)字符都是定長(zhǎng)的碼點(diǎn),對(duì)于只需要一個(gè)字節(jié)的字符,需要在前面補(bǔ)0. 這樣就照成了空間的浪費(fèi),文件就會(huì)變大。

UTF編碼除了UTF-8,還有UTF-16:最小的碼點(diǎn)為2個(gè)字節(jié);UTF-32:每個(gè)碼點(diǎn)固定用4個(gè)字節(jié)表示。由于UTF-32傳輸場(chǎng)進(jìn)下會(huì)照成文件空間浪費(fèi),HTML5標(biāo)準(zhǔn)規(guī)定,網(wǎng)頁(yè)不得編碼成UTF-32。

關(guān)于Unicode的介紹就到這。UCS的相關(guān)知識(shí),將在下一章結(jié)合JavaScript一起講到。

參考文章:
https://zh.wikipedia.org/wiki
http://www.ruanyifeng.com/blo...
https://www.zhihu.com/questio...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86750.html

相關(guān)文章

  • 細(xì)說(shuō)Unicode(二) Unicode與JavaScript的糾葛

    摘要:受到這個(gè)的影響,中的字符操作函數(shù)某些情況無(wú)法返回正確的結(jié)果。的碼點(diǎn),還有另外一種表示方法,稱為進(jìn)制轉(zhuǎn)義序列。這與我們的認(rèn)知有點(diǎn)不同,我們通常認(rèn)為一個(gè)表情符號(hào)也是一個(gè)字符,長(zhǎng)度為。而如果通過(guò)來(lái)判斷字符串長(zhǎng)度顯然是不夠準(zhǔn)確的。 大家對(duì)上一篇文章中提到的UCS編碼可能比較陌生。殊不知這就是JavaScript采用的編碼方法。 既然Unicode已經(jīng)統(tǒng)一了天下,為什么JavaScript不采用...

    Achilles 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)Python]坑爹的字符編碼

    摘要:所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問(wèn)題。在這個(gè)世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過(guò)十萬(wàn)個(gè)字符第十萬(wàn)個(gè)字符在年獲采納。涵蓋的數(shù)據(jù)除了視覺(jué)上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,比如一個(gè)str,如果都是英文,好說(shuō)多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學(xué)者,都要...

    rozbo 評(píng)論0 收藏0
  • 細(xì)說(shuō)Unicode(三) Unicode 番外之附加字符

    摘要:在各種論壇上,經(jīng)常會(huì)看到一些奇怪的字符,它們的內(nèi)容會(huì)超出顯示范圍,舉個(gè)例子常見(jiàn)的還有一些有泰文字符組成的。第一種是對(duì)字符串文字區(qū)域設(shè)置最大高度,超出的部分自動(dòng)隱藏。將附加字符進(jìn)行過(guò)濾,這種方法在某種程度上會(huì)誤殺一些需要正常顯示的附加符號(hào)。 在各種論壇上,經(jīng)常會(huì)看到一些奇怪的字符,它們的內(nèi)容會(huì)超出顯示范圍, 舉個(gè)例子: Z??????????????????A????????L?????...

    qujian 評(píng)論0 收藏0
  • 正則表達(dá)式巧用 Unicode 匹配特殊字符

    摘要:正則表達(dá)式巧用匹配特殊字符作者原文章首先聲明,本文所有的代碼都是在下面運(yùn)行,需要修改之后才能運(yùn)行,但是本文沒(méi)有涉及到太多的新特性,而且由于對(duì)修飾符不支持,最后的實(shí)現(xiàn)也基本是用的知識(shí)寫的代碼。 正則表達(dá)式巧用 Unicode 匹配特殊字符 作者 @zwhu 原文章 @github 首先聲明,本文所有的代碼都是在 ES6 下面運(yùn)行,ES5需要修改之后才能運(yùn)行,但是本文沒(méi)有涉及到太多的ES6...

    rubyshen 評(píng)論0 收藏0
  • 似懂非懂unicode

    摘要:起初這個(gè)委員沒(méi)有認(rèn)識(shí)到我國(guó)博大精深的語(yǔ)言文化,認(rèn)為用已經(jīng)足以表示世界上的任何一個(gè)字符。所以是一種編碼標(biāo)準(zhǔn),目標(biāo)將世界上的每一個(gè)字符用統(tǒng)一二進(jìn)制數(shù)字來(lái)表示。編碼期間有一段區(qū)間碼是保留的,保留的范圍是這段字符碼不表示任何字符。 ---對(duì)unicode編碼和java代碼單元問(wèn)題研究總結(jié) 前言:最近在《java編程思想》一書中看到了代碼點(diǎn)與代碼單元的概念,當(dāng)中介紹了java采用U...

    pingink 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<