編碼史記
來源:易賢網(wǎng) 閱讀:797 次 日期:2014-08-11 17:05:28
溫馨提示:易賢網(wǎng)小編為您整理了“編碼史記”,方便廣大網(wǎng)友查閱!

字符編碼的故事

字符是什么

字符是什么?就是有意義的圖形,比如a,中等。在不同的國家代表不同的意思。

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

編碼一點也不高深,就是一個計算機的01和字符ab的簡單映射。

于是故事開始了...

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

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

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

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 標準字集演化而來。

ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波羅的語族

ISO/IEC 8859-14(Latin-8 或 Celtic)- 凱爾特語族

ISO/IEC 8859-15 (Latin-9) - 西歐語言,加入Latin-1欠缺的芬蘭語字母和大寫法語重音字母,以及歐元(€)符號。

ISO/IEC 8859-16 (Latin-10) - 東南歐語言。主要供羅馬尼亞語使用,并加入歐元符號。

接著偉大的中國人也開始使用上電腦了。中文可不得了,文字博大精深,字符遠遠超過了256個。所以我們無法使用ASCII的擴展了。怎么辦呢? 1981年的時候,國家派一批人來做了這個事情,他們統(tǒng)計出所有的中文大概有6000多個字符(后來證明這些人的水品也是有限,好多字符都沒有搜出來,于是就有了多種的中文編碼),用兩個字節(jié)(16bit)來表示,16bit能表示的是65536個字符,太夠了。我們將16bit分為前8bit和后8bit

如果前8bit小于127(英文ASCII),那么這個8bit就是表示英文

如果前8bit大于127,那么這8bit和后面的8bit合起來表示一個中文

GB是啥意思?國標。

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

K是啥意思?擴展。

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

中國臺灣的人民當然不能使用大陸編輯使用的GBXX系列編碼了,于是他們自己搞了一套BIG5中文編碼,收錄了13060個漢字和字符。但是這里要注意,BIG5的編碼映射表和GBXX系列的就完全不一樣了,比如同一個“中”字,在BIG5和GB2312中就是兩個完全不同的字節(jié)。這里就會有亂碼出現(xiàn)了,比如("陶喆"和"陶吉吉"),各種簡體中文和繁體文的轉(zhuǎn)碼工具就出現(xiàn)了。

BIG5是什么意思?

五種中文套裝軟體:文書處理,資料庫,試算表,通訊,繪圖。大致的意思是這套編碼主要使用于這5個領域

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

切記:UTFXX是Unicode的具體實現(xiàn)方式。

UTF-16是Unicode最基本的實現(xiàn)。Unicode使用16bit表示一個字符,UTF-16就是直接將字符集的映射搬過來而已。

本來這樣就已經(jīng)很美好了,但是美國人又不干了。憑什么每個英語字符要占用2個字節(jié)?憑什么占用了我們的帶寬和CPU?于是一幫英語體系的外國人討論出了UTF-8這種字符編碼。

UTF-8這種編碼是怎么回事呢?

英文字符,和ASCII碼一樣,占用一個字節(jié)

其他語種,每種語種分配一個模板,這個模板有16bit,24bit,甚至還有32bit的。各個語種根據(jù)這個模板,將自己的語言轉(zhuǎn)化成模板要求的編碼(UTF-8)

這里演示一個中文字“漢”

比如中文分到的模板是1110xxxx 10yyyyyy 10zzzzzz

漢字的Unicode編碼是0x6C49,二進制是0110 1100 0100 1001

將這個二進制按照模板的x,y,z順序插入

得到11100110 10110001 10001001 就是E6 B1 89

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

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

具體請看這篇文章

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

更多信息請查看IT技術專欄

更多信息請查看網(wǎng)絡編程
易賢網(wǎng)手機網(wǎng)站地址:編碼史記

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網(wǎng)