亚洲全黄无码一级在线看_国产剧情久久久性色_无码av一区二区三区无码_亚洲成a×人片在线观看

當(dāng)前位置: 首頁(yè) > 科技新聞 >

程序員都應(yīng)該知道的編碼知識(shí)!

時(shí)間:2020-04-10 18:02來(lái)源:網(wǎng)絡(luò)整理 瀏覽:
來(lái)源丨花括號(hào)MC(huakuohao-mc)如有侵權(quán),請(qǐng)聯(lián)系刪除~在諜戰(zhàn)劇里,我們經(jīng)常看到這樣一個(gè)橋段,特工人員,千辛萬(wàn)苦拿到一條信息,打開(kāi)

來(lái)源丨花括號(hào)MC(huakuohao-mc)

如有侵權(quán),請(qǐng)聯(lián)系刪除~

在諜戰(zhàn)劇里,我們經(jīng)??吹竭@樣一個(gè)橋段,特工人員,千辛萬(wàn)苦拿到一條信息,打開(kāi)一看是一串?dāng)?shù)字,然后趕緊跑到一個(gè)秘密地方,拿出一個(gè)密碼本(也可能是一本唐詩(shī)選),按照一定規(guī)則(只有自己人知道),比如第一個(gè)數(shù)字表示頁(yè)數(shù),第二個(gè)數(shù)字表示行數(shù),第三個(gè)數(shù)字表示第幾個(gè)字,逐一將信息翻譯出來(lái)。如果這個(gè)過(guò)程中用了錯(cuò)誤的密碼本,或者不知道規(guī)則,那么將會(huì)解碼失敗。

程序員都應(yīng)該知道的編碼知識(shí)!

計(jì)算機(jī)的編解碼過(guò)程跟上面的過(guò)程是一樣一樣的。

計(jì)算機(jī)只認(rèn) 0 和 1,所有的影像和字符最終都會(huì)轉(zhuǎn)換成計(jì)算機(jī)能夠認(rèn)識(shí)的二進(jìn)制。一個(gè)二進(jìn)制位(bit)可以表示兩種狀態(tài) 0 和 1,一個(gè)字節(jié)(byte)由八個(gè)二進(jìn)制位組成,所以一個(gè)字節(jié)一共可以表示256(2^8)種狀態(tài)。如果我們規(guī)定每種狀態(tài)代表一個(gè)字符,那么一個(gè)字節(jié)就可以表達(dá)出 256 個(gè)字符。

一、ASCII

計(jì)算機(jī)是由美國(guó)人發(fā)明的,所以在最初設(shè)計(jì)編碼的時(shí)候,就只考慮了英文的編碼。英文字符很少,加上一些特殊字符,一共也就100個(gè)左右,確切的說(shuō)是128個(gè)。這樣的話用一個(gè)字節(jié)進(jìn)行編碼就完全夠了,不僅夠用了,而且還富裕出一位,即第一位一直沒(méi)有參與編碼,統(tǒng)一定為 0。這就是所謂的 ASCII 編碼。在 ASCII 編碼中,空格SPACE是32(二進(jìn)制 00100000 ),大寫(xiě)的字母 A 是 65 (二進(jìn)制01000001)。

二、非ASCII

隨著計(jì)算機(jī)的普及,歐洲也開(kāi)始普及計(jì)算機(jī),歐洲人發(fā)現(xiàn) ASCII 規(guī)定的 128 個(gè)字符不能滿足他們的使用,比如,在法語(yǔ)中,字母上方有注音符號(hào),就無(wú)法用 ASCII 碼表示。于是,一些歐洲國(guó)家就決定,把字節(jié)中閑置的第一位編入新的符號(hào)。比如,法語(yǔ)中的 é 的編碼為 130 (二進(jìn)制10000010)。這樣一來(lái),這些歐洲國(guó)家使用的編碼體系,最多可以表示 256 個(gè)符號(hào)。這就是大家經(jīng)常見(jiàn)到的ISO-8859-1 編碼,也叫Latin1 編碼。

三、中文編碼

隨著計(jì)算機(jī)的普及,國(guó)人也開(kāi)始使用計(jì)算機(jī),但是發(fā)現(xiàn)按照之前的編碼方式,根本就沒(méi)有漢字什么事兒,也就是計(jì)算機(jī)根本沒(méi)辦法認(rèn)識(shí)漢字。

1)GB2312

為了能夠讓計(jì)算機(jī)認(rèn)識(shí)漢字,我們決定對(duì)漢字進(jìn)行編碼,本著敢想敢干的精神,我們規(guī)定用兩個(gè)字節(jié)表示一個(gè)漢字。具體規(guī)則是這樣的:一個(gè)小于 127 的字節(jié)代表的意義與原來(lái)的 ASCII 相同,但兩個(gè)大于127的字節(jié)連在一起時(shí),就表示這是一個(gè)漢字,前面的一個(gè)字節(jié)稱(chēng)為高字節(jié),后面一個(gè)字節(jié)稱(chēng)為低字節(jié),這樣我們就可以組合出6763 個(gè)簡(jiǎn)體漢字。這就是大家常說(shuō)的GB2312 編碼。

2)GBK

很顯然 GB2312 編碼的 6763 個(gè)漢字,并不能適應(yīng)所有的使用場(chǎng)景,比如“喆”字就不再其中,于是在 GB2312 的基礎(chǔ)上又進(jìn)行了新的擴(kuò)展,規(guī)定只要第一個(gè)字節(jié)是大于 127 的就OK,至于第二個(gè)字節(jié)是大于 127 還是小于 127 都無(wú)所謂了。經(jīng)過(guò)這樣的改動(dòng)之后,收錄的漢字及符號(hào)就可以達(dá)到 2W 多個(gè),這就是我們常說(shuō)的GBK 編碼。

再后來(lái),人們繼續(xù)對(duì)第二個(gè)字節(jié)進(jìn)行擴(kuò)展,發(fā)展出了 GB18030 編碼,比 GBK 又多出了一些字符編碼。

至此,所有的漢字編碼都是用兩個(gè)字節(jié)表示的,但是英文是用一個(gè)字節(jié)表示。上了一些年紀(jì)的程序員都體驗(yàn)過(guò),一個(gè)漢字算兩個(gè)英文字符的經(jīng)歷。

3)BIG-5

上面提到的都是簡(jiǎn)體中文編碼,雖然 GBK 及 GB18030 包含了部分繁體字,但是也不全面,于是臺(tái)灣同胞就發(fā)了專(zhuān)門(mén)支持繁體字的 Big5 編碼,也就是大家經(jīng)常說(shuō)的大五碼。

四、一個(gè)小問(wèn)題

不知道大家有沒(méi)有注意到一個(gè)問(wèn)題,在單字節(jié)編碼的時(shí)候,對(duì)于那些大于 127 小于 256 的編碼,在不同的國(guó)家代表的字母很可能不一樣。比如,130 在法語(yǔ)編碼中代表了é,在希伯來(lái)語(yǔ)編碼中卻代表了字母Gimel (?),在俄語(yǔ)編碼中又會(huì)代表另一個(gè)符號(hào)。在漢字的雙字節(jié)編碼中也存在這樣的問(wèn)題,比如BIG5編碼跟GBK 編碼都是雙字節(jié)編碼,但是代表的漢字卻不一樣。

這就相當(dāng)于,同樣一串二進(jìn)制數(shù)值,A特工組織按照他們的規(guī)則解析出來(lái)可能是“你好”,而B(niǎo)特工組織按照他們的規(guī)則解析出來(lái)可能是“滾蛋”。特工組織之間的翻譯標(biāo)準(zhǔn)不一樣是相當(dāng)有必要的,但是計(jì)算機(jī)的編碼規(guī)則如果各不相同就比較麻煩了。比如你跟臺(tái)灣的志玲姐姐聊天,志玲姐姐用BIG5 編碼給你發(fā)了一封信,然后你用 GBK 去解碼,……,也許就沒(méi)有然后了。

五、Unicode

為了解決上面的問(wèn)題,有個(gè)叫ISO 的國(guó)際標(biāo)準(zhǔn)組織,決定放棄所有區(qū)域性編碼,如BIG5,GBK 等,重新制定一個(gè)新的編碼,這個(gè)編碼集將包含所有字符的編碼,這樣大家就都統(tǒng)一了,這套編碼的英文全稱(chēng)“Universal Multiple-Octet Coded Character Set”,簡(jiǎn)稱(chēng)UCS, 俗稱(chēng) “Unicode”。Unicode 的出現(xiàn)相當(dāng)于秦始皇對(duì)度量衡跟貨幣進(jìn)行了統(tǒng)一。

Unicdoe 按照日常字符的使用頻繁度劃分了17 個(gè)平面,編號(hào)為0-16 ,0 號(hào)平面稱(chēng)為基本多語(yǔ)言平面(Basic Multilingual Plane,簡(jiǎn)稱(chēng) BMP ),包含了日常使用最頻繁的字符,編碼范圍從0000 到 FFFF,這樣該平面可以表示2^16=65536 個(gè)字符;其它平面的編碼范圍也是從0000 到 FFFF,所以其它平面也可以編碼 65535 個(gè)字符,這樣 17 個(gè)平面一共可以編碼 17×65,536 = 1,114,112 個(gè)符號(hào)。

我們最常用的 Unicode 編碼使用的是多語(yǔ)言平面的編碼,即所有字符都用兩個(gè)字節(jié)進(jìn)行編碼(其它平面可能需要三個(gè)或四個(gè)字節(jié))。舉個(gè)例子比如中國(guó)的‘中'字Unicode 碼是 4E2D,小寫(xiě)‘a(chǎn)'的 Unicode 碼是 0061.

這里面存在兩個(gè)問(wèn)題,如果所有英文字符都是按照 Unicode 編碼,那么會(huì)出現(xiàn)浪費(fèi)存儲(chǔ)空間的問(wèn)題。明明一個(gè)字節(jié)可以搞定的事情,偏偏要用兩個(gè)字節(jié)。第二個(gè)問(wèn)題就是計(jì)算機(jī)如何知道這是Unicode 編碼還是ASCII 編碼,也就是2 個(gè)字節(jié)表示的一個(gè)字符,還是2 個(gè)字符呢。

六、UTF

UTF 的全稱(chēng)是Unicode Transformation Format,也就是Unicode 的轉(zhuǎn)換格式。上面提到了,如果直接使用 Unicode 碼進(jìn)行存儲(chǔ)會(huì)存在浪費(fèi)空間的問(wèn)題,而UTF-8 的出現(xiàn)就是為了解決該問(wèn)題,UTF-8 使用變長(zhǎng)的方式存儲(chǔ) Unicode 碼,也就是英文字符繼續(xù)使用一個(gè)字節(jié)進(jìn)行存儲(chǔ),但是漢字要使用 3 個(gè)字節(jié)。那么UTF-8 是如何做到的呢。

首先,對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為 0 ,后面 7 位為這個(gè)符號(hào)的 Unicode 碼。因此對(duì)于英語(yǔ)字母,UTF-8 編碼和 ASCII 碼是相同的。

其次,對(duì)于 n 字節(jié)的符號(hào)(n > 1),第一個(gè)字節(jié)的前 n 位都設(shè)為 1,第 n + 1 位設(shè)為 0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的 Unicode 碼。

下表總結(jié)了編碼規(guī)則,字母 x 代表可用的編碼位。

程序員都應(yīng)該知道的編碼知識(shí)!

根據(jù)上表,對(duì)UTF-8 編碼進(jìn)行解讀會(huì)發(fā)現(xiàn),如果一個(gè)字節(jié)的第一位是 0,則這個(gè)字節(jié)單獨(dú)就是一個(gè)字符;如果第一位是 1,則連續(xù)有多少個(gè) 1,就表示當(dāng)前字符占用多少個(gè)字節(jié)。

舉個(gè)例子

假設(shè)“hello世界”這樣一個(gè)字符串,他們的 Unicode 的編碼分別是

1h--0068
2e--0065
3l--006C
4l--006C
5o--006F
6世--4E16
7界--754C

按照 UTF-8 的編碼規(guī)則可以得到如下UTF-8 編碼

1h--01101000
2e--01100101
3l--01101100
4l--01101100
5o--01101111
6世--11100100-10111000-10010110
7界--11100111-10010101-10001100

可以看到用UTF-8 編碼之后,英文字符占用一個(gè)字節(jié),而漢字占用了三個(gè)字節(jié),一共需要 11個(gè)字節(jié),而如果直接存儲(chǔ) Unicode 碼則需要 14 個(gè)字節(jié)。UTF-8 編碼對(duì)于英文來(lái)說(shuō)節(jié)省了很大空間,但是對(duì)于中文來(lái)說(shuō)增加了空間。

七、Little endian 和 Big endian

上面提到Unicode 是用兩個(gè)字節(jié)表示字符,如果第一個(gè)字節(jié)在前,就是“大端方式"(Big endian),第二個(gè)字節(jié)在前就是“小端方式"(Little endian)?!?#39;字的Unicode 碼是 4E16,一個(gè)字節(jié)是 4E,一個(gè)字節(jié)是 16 , 存儲(chǔ)的時(shí)候如果4E 在前就是大端存儲(chǔ),如果是16 在前就是小端存儲(chǔ)。

那么計(jì)算機(jī)是怎么知道一個(gè)文件是采用哪種編碼方式呢?

Unicode 規(guī)范定義,每一個(gè)文件的最前面分別加入一個(gè)表示編碼順序的字符,這個(gè)字符的名字叫做“零寬度非換行空格"(zero width no-break space),用FEFF 表示。這正好是兩個(gè)字節(jié),而且FF 比 FE 大1。

如果一個(gè)文本文件的頭兩個(gè)字節(jié)是FE FF,就表示該文件采用大頭方式;如果頭兩個(gè)字節(jié)是FF FE,就表示該文件采用小頭方式。

八、總結(jié)

UTF-8 編碼是基于Unicode 字符集的一種編碼實(shí)現(xiàn)?,F(xiàn)在幾乎所有的編程語(yǔ)言和操作系統(tǒng)都支持 Unicode 編碼,使用Unicode 編碼之后,再也不會(huì)出現(xiàn)上文提到的一個(gè)漢字等于兩個(gè)英文字符的尷尬局面。

GBK,BIG5 等都屬于區(qū)域性編碼只能在固定范圍內(nèi)使用,比如GBK 只適合在簡(jiǎn)體中文環(huán)境使用,雖然 GBK 相比于UTF-8 更節(jié)省空間,但現(xiàn)在全世界都變成地球村了,所以還是建議大家都使用UTF-8 編碼。

ANSI:在window下,如果我們用記事本打開(kāi)文檔,經(jīng)常會(huì)見(jiàn)到ANSI 編碼方式,這是Windows 默認(rèn)的編碼方式。對(duì)于英文文檔采用ASCII編碼,對(duì)于簡(jiǎn)體中文文檔采用 GB2312 編碼(只針對(duì) Windows 簡(jiǎn)體中文版,如果是繁體中文版會(huì)采用 Big5 碼)。

喜歡請(qǐng)多多關(guān)注易杰智科技!

推薦內(nèi)容