字符章贞,字符集,字符編碼

Unicode

現(xiàn)在Unicode已然一統(tǒng)天下非洲,我想很多年輕的程序員可能都沒遇到過編碼問題鸭限,更不用說了解編碼的發(fā)展了。前些日子在一個老網(wǎng)站上偶遇亂碼两踏,雖然入行時間不短败京,但對其究竟也是不甚了解,好奇心驅(qū)使下落入深坑梦染。還好經(jīng)過一段時間的摸爬滾打赡麦,邊學(xué)邊寫,總算大概理清了個脈絡(luò)帕识,記錄之泛粹,分享之。

概念


字符是一個信息單位肮疗,在計算機里面晶姊,一個中文漢字是一個字符,一個英文字母是一個字符伪货,一個阿拉伯?dāng)?shù)字是一個字符帽借,一個標(biāo)點符號也是一個字符。

字符集是字符組成的集合超歌,通常以二維表的形式存在,二維表的內(nèi)容和大小是由使用者的語言而定蒂教,是英語巍举,是漢語,還是阿拉伯語凝垛。

字符編碼是把字符集中的字符編碼為特定的二進制數(shù)懊悯,以便在計算機中存儲。編碼方式一般就是對二維表的橫縱坐標(biāo)進行變換的算法梦皮。一般都比較簡單炭分,直接把橫縱坐標(biāo)拼一起就完事了。后來隨著字符集的不斷擴大剑肯,為了節(jié)省存儲空間捧毛,才出現(xiàn)了各種各樣的算法。

字符集和字符編碼一般都是成對出現(xiàn)的,如ASCII呀忧、IOS-8859-1师痕、GB2312、GBK而账,都是即表示了字符集又表示了對應(yīng)的字符編碼胰坟,以后統(tǒng)稱為編碼。Unicode比較特殊泞辐,后面細(xì)說笔横。

發(fā)展


單字節(jié)

計算機是美國人發(fā)明的,人家用的是美式英語咐吼,字符比較少吹缔,所以一開始就設(shè)計了一個不大的二維表,128個字符汽烦,取名叫ASCII(American Standard Code for Information Interchange)涛菠。128個碼位,用7位二進制數(shù)表示撇吞,由于計算機1個字節(jié)是8位二進制數(shù)俗冻,所以最高位為0,即00000000-011111110x00-0x7F牍颈。

ASCII

后來美國人發(fā)現(xiàn)128個碼位不夠用迄薄,于是在原來二維表的基礎(chǔ)上進行了擴展,256個字符煮岁,取名叫EASCII(Extended ASCII)讥蔽。256個碼位,用8位二進制數(shù)表示画机,即00000000-111111110x00-0xFF冶伞。

EASCII

當(dāng)計算機傳到了歐洲,美國人的標(biāo)準(zhǔn)不適用了步氏,但是改改還能湊合响禽。于是國際標(biāo)準(zhǔn)化組織在ASCII的基礎(chǔ)上進行了擴展,形成了ISO-8859標(biāo)準(zhǔn)荚醒,跟EASCII類似芋类,兼容ASCII,在高128個碼位上有所區(qū)別界阁。但是由于歐洲的語言環(huán)境十分復(fù)雜侯繁,所以根據(jù)各地區(qū)的語言又形成了很多子標(biāo)準(zhǔn),ISO-8859-1泡躯、ISO-8859-2贮竟、ISO-8859-3丽焊、……、ISO-8859-16坝锰,真是令人發(fā)指粹懒。

雙字節(jié)

當(dāng)計算機傳到了亞洲,尤其是東亞顷级,國際標(biāo)準(zhǔn)被秒殺了凫乖,路邊小孩隨便說句話,256個碼位就不夠用了弓颈。于是乎繼續(xù)擴大二維表帽芽,單字節(jié)改雙字節(jié),16位二進制數(shù)翔冀,65536個碼位导街。在不同國家和地區(qū)又出現(xiàn)了很多編碼,大陸的GB2312纤子、港臺的BIG5搬瑰、日本的Shift JIS等等。

注意65536個碼位這種說法只是理想情況控硼,由于雙字節(jié)編碼可以是變長的泽论,也就是說同一個編碼里面有些字符是單字節(jié)表示,有些字符是雙字節(jié)表示卡乾。這樣做的好處是翼悴,一方面可以兼容ASCII,另一方面可以節(jié)省存儲容量幔妨,代價就是會損失一部分碼位鹦赎。而且編碼的設(shè)計也并不是想象的那樣,所有字符從頭到尾布滿整個二維表误堡,都是有預(yù)留空間的古话。比如說GBK是GB2312的擴展(K竟然是拼音KuoZhan的縮寫),按理說都屬于雙字節(jié)編碼锁施,碼位是一樣的煞额,根本談不上擴展,但實際上是預(yù)留空間在起作用沾谜。比如下圖為GBK的編碼空間,GBK/1胀莹、GBK/2是GB2312的區(qū)域基跑,GBK/3、GBK/4描焰、GBK/5是GBK的區(qū)域媳否,紅色是用戶自定義區(qū)域栅螟,白色可能就是由于變長編碼損失的區(qū)域了。

GBK
Unicode

當(dāng)互聯(lián)網(wǎng)席卷了全球篱竭,地域限制被打破了力图,不同國家和地區(qū)的計算機在交換數(shù)據(jù)的過程中,就會出現(xiàn)亂碼的問題掺逼,跟語言上的地理隔離差不多吃媒。亂碼是怎么出現(xiàn)的呢?對同一組二進制數(shù)據(jù)吕喘,不同的編碼會解析出不同的字符赘那,用對了編碼,解析出來的字符組成的文字是有意義的氯质,用錯了編碼募舟,解析出來的字符組成的文字是沒意義的,也就是通常所說的亂碼闻察。

經(jīng)過之前的介紹拱礁,編碼很多,全球的計算機們沒辦法在一起好好的玩耍辕漂。要徹底解決這個問題呢灶,替代原先基于語言的編碼系統(tǒng),就需要一個通用的字符集UCS(Universal Character Set)和一個通用的字符編碼Unicode钮热。一開始UCS用2個字節(jié)表示填抬,叫做UCS-2,后來2個字節(jié)不夠用隧期,于是就用4個字節(jié)飒责,叫做UCS-4。但是如果每一個字符都用4個字節(jié)來表示的話仆潮,相較之前的編碼會浪費很多存儲空間宏蛉,尤其是相對ASCII等單字節(jié)編碼會非常吃虧。并且當(dāng)時已經(jīng)有些廠商在雙字節(jié)編碼上投入了很大的精力性置。于是UTF-16就被作為一種折中的方案提了出來拾并,既保持了兩字節(jié)不變,又保證了足夠的編碼空間鹏浅。而UTF-32是與UCS-4相對應(yīng)的嗅义,UTF-8則由于擴展性比較強,從容應(yīng)對了UCS-2到UCS-4的改變隐砸。關(guān)于各種UTF的實現(xiàn)細(xì)節(jié)可以點擊鏈接查看(翻墻)之碗,已經(jīng)說得很清楚了,就不贅述了季希,但不得不提一下褪那,UTF-16的設(shè)計還挺巧妙的幽纷。

UTF(Unicode Transformation Format)是將Unicode編碼進行了轉(zhuǎn)換,通常會在存儲空間和效率上進行一定的權(quán)衡博敬,有很多種實現(xiàn)方式友浸,前面提到了UTF-8和UTF-16是最常用的。這就是之前提到的Unicode的特殊之處偏窝。

歷史
  • ASCII
    1960 開發(fā)
    1963 發(fā)布
    1986 最后一次更新

  • ISO-8859-1
    1998 發(fā)布

  • GB2312
    1980 發(fā)布

  • GBK
    1993 發(fā)布

  • UCS-2
    In the late 1980s

  • Unicode
    1987 開發(fā)
    1991 發(fā)布
    1996 實現(xiàn)代理機制(UTF-16)
    2015 最新版8.0

  • UTF-8
    1993 發(fā)布
    2008 流行

  • UTF-16
    1996 開發(fā)
    2000 發(fā)布

根據(jù)以上各個編碼發(fā)展的一些時間節(jié)點收恢,再配合下圖UTF-8制霸互聯(lián)網(wǎng)過程,會有一個比較清晰的了解囚枪。

UTF-8

尾聲


雖然Unicode解決了地球上的問題派诬,但是以后三體人入侵可怎么辦,根據(jù)這些天研究編碼發(fā)展歷史來看链沼,比較靠譜的回答——還是到時再說吧默赂。

本文是根據(jù)互聯(lián)網(wǎng)上各種信息來源,主要是維基百科括勺,加上自己的理解缆八,進行的總結(jié)和演繹,肯定有不準(zhǔn)確或錯誤的地方疾捍,還望不吝賜教奈辰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乱豆,隨后出現(xiàn)的幾起案子奖恰,更是在濱河造成了極大的恐慌,老刑警劉巖宛裕,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟啃,死亡現(xiàn)場離奇詭異,居然都是意外死亡揩尸,警方通過查閱死者的電腦和手機蛹屿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩榆,“玉大人错负,你說我怎么就攤上這事∮卤撸” “怎么了犹撒?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粒褒。 經(jīng)常有香客問我识颊,道長,這世上最難降的妖魔是什么怀浆? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任谊囚,我火速辦了婚禮,結(jié)果婚禮上执赡,老公的妹妹穿的比我還像新娘镰踏。我一直安慰自己,他們只是感情好沙合,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布奠伪。 她就那樣靜靜地躺著,像睡著了一般首懈。 火紅的嫁衣襯著肌膚如雪绊率。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天究履,我揣著相機與錄音滤否,去河邊找鬼。 笑死最仑,一個胖子當(dāng)著我的面吹牛藐俺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泥彤,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欲芹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吟吝?” 一聲冷哼從身側(cè)響起菱父,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剑逃,沒想到半個月后浙宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡炕贵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年梆奈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片称开。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡亩钟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳖轰,到底是詐尸還是另有隱情清酥,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布蕴侣,位于F島的核電站焰轻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昆雀。R本人自食惡果不足惜辱志,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一蝠筑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揩懒,春花似錦什乙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至智亮,卻和暖如春忆某,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阔蛉。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工弃舒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馍忽。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓棒坏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遭笋。 傳聞我的和親對象是個殘疾皇子坝冕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容