佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 編碼史記

編碼史記

熱門標(biāo)簽:檢查注冊表項(xiàng) 網(wǎng)站文章發(fā)布 服務(wù)器配置 呼叫中心市場需求 銀行業(yè)務(wù) 美圖手機(jī) 鐵路電話系統(tǒng) 智能手機(jī)
字符編碼的故事
字符是什么
字符是什么?就是有意義的圖形,比如a,中等。在不同的國家代表不同的意思。

但是在計(jì)算機(jī)世界中只有0和1,好了,如何用0和1將這些字符表示出來呢?這就是編碼存在的意義。

編碼一點(diǎn)也不高深,就是一個(gè)計(jì)算機(jī)的01和字符ab的簡單映射。

于是故事開始了...
很久很久以前,計(jì)算機(jī)世界只有美國人。美國人的文字造詣很低的,他們的所有文字就只有24個(gè)字母,甚至加上大寫和小寫,阿拉伯?dāng)?shù)字,計(jì)算機(jī)中的控制符(回車啥的)都不超過256個(gè)(只有127個(gè))。于是,對(duì)于他們來說,很自然,那么計(jì)算機(jī)中用8位就可以表示他們的所有字符了吧。于是他們將8位稱作一個(gè)字節(jié),計(jì)算機(jī)的8位表示的每個(gè)數(shù)字對(duì)應(yīng)了一個(gè)英文字符,畫了一張表(ASCII碼表)。最早的編碼AscII碼出現(xiàn)了。

歐洲人出場了。歐洲是有好多個(gè)國家的,他們的每個(gè)國家也都有自己的文字,比如拉丁文,希臘文等。怎么辦呢?于是想到,你美國人指定的ASCII碼表里面不是只有127個(gè)字符嗎,后面128-255的字符不是說待定嗎,好吧,我們就不客氣了。于是歐洲人就將各種奇怪的語言塞入127后面的字符中,形成了一系列的ISO 8859字符集。比如希臘文塞入ASCII,就形成了ISO/IEC 8859-7,西歐語種塞入ASCII就形成了ISO/IEC 8859-1,ISO/IEC 8859-1也叫做latin-1。(對(duì),就是mysql里面經(jīng)常見到的編碼)

下面是ISO 8859現(xiàn)有的15個(gè)字符集

ISO/IEC 8859-1 (Latin-1) - 西歐語言
ISO/IEC 8859-2 (Latin-2) - 中歐語言
ISO/IEC 8859-3 (Latin-3) - 南歐語言。世界語也可用此字符集顯示。
ISO/IEC 8859-4 (Latin-4) - 北歐語言
ISO/IEC 8859-5 (Cyrillic) - 斯拉夫語言
ISO/IEC 8859-6 (Arabic) - 阿拉伯語
ISO/IEC 8859-7 (Greek) - 希臘語
ISO/IEC 8859-8 (Hebrew) - 希伯來語(視覺順序)
ISO 8859-8-I - 希伯來語(邏輯順序)
ISO/IEC 8859-9(Latin-5 或 Turkish)- 它把Latin-1的冰島語字母換走,加入土耳其語字母。
ISO/IEC 8859-10(Latin-6 或 Nordic)- 北日耳曼語支,用來代替Latin-4。
ISO/IEC 8859-11 (Thai) - 泰語,從泰國的 TIS620 標(biāo)準(zhǔn)字集演化而來。
ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波羅的語族
ISO/IEC 8859-14(Latin-8 或 Celtic)- 凱爾特語族
ISO/IEC 8859-15 (Latin-9) - 西歐語言,加入Latin-1欠缺的芬蘭語字母和大寫法語重音字母,以及歐元(€)符號(hào)。
ISO/IEC 8859-16 (Latin-10) - 東南歐語言。主要供羅馬尼亞語使用,并加入歐元符號(hào)。


接著偉大的中國人也開始使用上電腦了。中文可不得了,文字博大精深,字符遠(yuǎn)遠(yuǎn)超過了256個(gè)。所以我們無法使用ASCII的擴(kuò)展了。怎么辦呢? 1981年的時(shí)候,國家派一批人來做了這個(gè)事情,他們統(tǒng)計(jì)出所有的中文大概有6000多個(gè)字符(后來證明這些人的水品也是有限,好多字符都沒有搜出來,于是就有了多種的中文編碼),用兩個(gè)字節(jié)(16bit)來表示,16bit能表示的是65536個(gè)字符,太夠了。我們將16bit分為前8bit和后8bit
如果前8bit小于127(英文ASCII),那么這個(gè)8bit就是表示英文
如果前8bit大于127,那么這8bit和后面的8bit合起來表示一個(gè)中文
GB是啥意思?國標(biāo)。

好了,后來某些領(lǐng)導(dǎo)發(fā)現(xiàn),他的名字沒法編碼了,這個(gè)問題出來了。6000個(gè)漢字還不足以囊括所有中文,國家在1995年又組織了一批人,繼續(xù)搜羅一些生僻字,一共搜集出了21886個(gè)漢字和字符,形成了GBK編碼,GBK編碼向下兼容GB2312。

K是啥意思?擴(kuò)展。

再后來發(fā)現(xiàn)了,一些滿文,蒙古文啥的少數(shù)名族的語言沒有編輯到GBK中,繼續(xù)編輯收錄,形成了GB18030編碼。

中國臺(tái)灣的人民當(dāng)然不能使用大陸編輯使用的GBXX系列編碼了,于是他們自己搞了一套BIG5中文編碼,收錄了13060個(gè)漢字和字符。但是這里要注意,BIG5的編碼映射表和GBXX系列的就完全不一樣了,比如同一個(gè)“中”字,在BIG5和GB2312中就是兩個(gè)完全不同的字節(jié)。這里就會(huì)有亂碼出現(xiàn)了,比如("陶喆"和"陶吉吉"),各種簡體中文和繁體文的轉(zhuǎn)碼工具就出現(xiàn)了。
BIG5是什么意思?
五種中文套裝軟體:文書處理,資料庫,試算表,通訊,繪圖。大致的意思是這套編碼主要使用于這5個(gè)領(lǐng)域

各個(gè)國家使用各個(gè)國家自己的編碼有沒有很繁瑣?于是大家很期盼有一種統(tǒng)一的編碼形式出現(xiàn)。Unicode編碼出現(xiàn)了。Unicode使用的通用的字符集叫做UCS。這個(gè)字符集就是一個(gè)大的字符空間,每個(gè)語種都在這個(gè)字符空間內(nèi)劃分一段領(lǐng)域?,F(xiàn)在應(yīng)用的UCS是UCS-2,意思就是不管是英文中文,統(tǒng)一使用兩個(gè)字節(jié)(16bit)來進(jìn)行字符分配。UCS-2字符集可以表示216(即65536)個(gè)字符。已經(jīng)基本滿足世界上所有語言了。如果不夠怎么辦?已經(jīng)有預(yù)定方案UCS-4(用4個(gè)字節(jié)表示一個(gè)字符)。

切記:UTFXX是Unicode的具體實(shí)現(xiàn)方式。
UTF-16是Unicode最基本的實(shí)現(xiàn)。Unicode使用16bit表示一個(gè)字符,UTF-16就是直接將字符集的映射搬過來而已。

本來這樣就已經(jīng)很美好了,但是美國人又不干了。憑什么每個(gè)英語字符要占用2個(gè)字節(jié)?憑什么占用了我們的帶寬和CPU?于是一幫英語體系的外國人討論出了UTF-8這種字符編碼。
UTF-8這種編碼是怎么回事呢?
英文字符,和ASCII碼一樣,占用一個(gè)字節(jié)
其他語種,每種語種分配一個(gè)模板,這個(gè)模板有16bit,24bit,甚至還有32bit的。各個(gè)語種根據(jù)這個(gè)模板,將自己的語言轉(zhuǎn)化成模板要求的編碼(UTF-8)


這里演示一個(gè)中文字“漢”
比如中文分到的模板是1110xxxx 10yyyyyy 10zzzzzz
漢字的Unicode編碼是0x6C49,二進(jìn)制是0110 1100 0100 1001
將這個(gè)二進(jìn)制按照模板的x,y,z順序插入
得到11100110 10110001 10001001 就是E6 B1 89


好了…大家看出這個(gè)對(duì)中文有什么不好的嗎?原先一個(gè)中文使用UTF-16只需要兩個(gè)字節(jié),但是使用UTF-8卻需要3個(gè)字節(jié),如果一個(gè)網(wǎng)頁有1w個(gè)中文字,那么我們就需要多傳輸1w個(gè)字節(jié),帶寬啊?。?現(xiàn)在就明白了,為什么國內(nèi)一些網(wǎng)站,比如sina,它的編碼規(guī)則是使用GBK了吧!

下面再說一下很多編輯器的自動(dòng)編碼匹配的問題。編輯器會(huì)檢查出你輸入的字符是UTF-8還是GBK,基本根據(jù)的就是這個(gè)UTF-8模板,如果符合模板,就會(huì)判斷是UTF-8。很多文章說的txt中輸入“聯(lián)通”存為GBK編碼再打開會(huì)出現(xiàn)亂碼就是這個(gè)原因?qū)е碌摹?
具體請看這篇文章

還有一種ANSI是什么呢?windows內(nèi)核是使用UTF-16編寫的,但是頁面上展示的語言是根據(jù)系統(tǒng)設(shè)置的“語言”來展示的。ANSI就是windows系統(tǒng)根據(jù)你設(shè)置的語言環(huán)境而進(jìn)行自動(dòng)變化的一種編碼。比如在中文windows系統(tǒng)下,ANSI就代表GBK編碼,日文操作系統(tǒng)下就代表JIS編碼。

參考資料

字符編碼詳解及由來
字符集和字符編碼
您可能感興趣的文章:
  • 字符集和字符編碼(Charset Encoding)
  • 字符編碼詳解及由來(UNICODE,UTF-8,GBK) 比較詳細(xì)

標(biāo)簽:上海 紅河 樂山 新疆 長治 滄州 沈陽 河南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《編碼史記》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    浦东新区| 万安县| 丘北县| 萨嘎县| 台中市| 灵山县| 澳门| 朝阳区| 张家界市| 石泉县| 武陟县| 宝应县| 略阳县| 伊川县| 岢岚县| 小金县| 乌拉特中旗| 克什克腾旗| 嵩明县| 扬州市| 丰城市| 乐东| 如东县| 巴东县| 临夏县| 博湖县| 永宁县| 泾源县| 攀枝花市| 普定县| 吉木萨尔县| 大埔区| 富源县| 贺州市| 咸丰县| 凌源市| 台中县| 扶沟县| 大名县| 宝清县| 清远市|