UTF-8與GBK字符集解析

字符集的三個要素

  • 字符表:要顯示的字符的集合(例如所有的英文字符落剪、所有的漢字)
  • 字符編碼:字符表中的字符對應的二進制表示
  • 字符集:定義了一種規(guī)則孟辑,將一串二進制數(shù)字解釋為一個字符

Unicode編碼

Unicode是計算機科學領域里的一項業(yè)界標準。它對世界上大部分的文字系統(tǒng)進行了整理楔敌、編碼,使得電腦可以用更為簡單的方式來呈現(xiàn)和處理文字驻谆。目前已經(jīng)編碼了12萬+的字符卵凑。—— 維基百科

簡單來說胜臊,Unicode就是給世界上存在的字符都賦予唯一的二進制編碼勺卢。

Unicode直接做字符集的問題

因為Unicode要編碼所有可能的字符,那么每個字符占用的字節(jié)長度就會變多象对。以英文為例黑忱,一個英文字符使用ASCII碼只需要一個字節(jié),而用Unicode需要4個字節(jié),甚至更多甫煞。并且前面的字節(jié)都是0菇曲。這樣純英文文件的存儲大小就會成倍擴大,是極大的浪費抚吠。

UTF-8編碼

一種變長的編碼方式常潮,基于Unicode的一種實現(xiàn)。它使用1--4個字節(jié)表示一個字符楷力,根據(jù)不同的字符變化字節(jié)的長度喊式,可以節(jié)省空間。編碼規(guī)則如下:

  • 對于單字節(jié)的字符萧朝,字節(jié)的第一位設為0岔留,后面7位是這個字符的unicode碼。ASCII碼表中的字符检柬,UTF-8編碼與其ASCII碼保持一致献联。
  • 對于n個字節(jié)的字符(n>1),第一個字節(jié)的前n位都設為1厕吉,第n+1位設為0酱固,后面字節(jié)的前兩位均設為10。剩余的二進制位头朱,從后向前填上這個符號的unicode碼运悲。用0填充未使用的二進制位。
Unicode范圍 編碼格式 剩余位數(shù)
000000 – 00007F 0xxxxxxx 7位
000080 – 0007FF 110xxxxx 10xxxxxx 11位
000800 – 00FFFF 1110xxxx 10xxxxxx 10xxxxxx 16位
010000 – 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 21位

根據(jù)上表可以看出项钮,UTF-8剩余可以填的位數(shù)班眯,決定了對應Unicode編碼的范圍。 下面舉個轉(zhuǎn)換的例子:
"樊"的unicode是6A0A(0110 1010 0000 1010)烁巫,查表可知署隘,6A0A屬于第三行的范圍,因此"樊"的UTF-8編碼需要三個字節(jié)亚隙,即格式是 1110xxxx 10xxxxxx 10xxxxxx 磁餐。然后,從6A 0A的最后一個二進制位開始阿弃,從后向前填入格式中的x诊霹,多出的位補0。最終渣淳,"樊"的UTF-8編碼是11100110 10101000 10001010(E6 A8 8A)
由此可以總結出字符用UTF-8編碼的規(guī)律:

  • 4個字節(jié)的UTF-8十六進制編碼一定是以F開頭
  • 3個字節(jié)的UTF-8十六進制編碼一定是以E開頭
  • 2個字節(jié)的UTF-8十六進制編碼一定是以C或D開頭
  • 1個字節(jié)的UTF-8十六進制編碼一定是以小于8的數(shù)字開頭

注:UTF-8并沒有編碼所有的Unicode的字符脾还,只包含了第0號平面(plane)和部分1號平面的字符。這屬于更深層次的探究入愧,感興趣的讀者可以通過UTF-8Unicode字符平面映射了解鄙漏。

中文編碼

GB2312

該字符集使用2個字節(jié)表示一個字符嗤谚。簡單地理解,一個小于127的字節(jié)的意義與ASCII碼相同怔蚌,但兩個大于127的字節(jié)連在一起時巩步,就是GB2312編碼的字符。以下是兩個字節(jié)的具體范圍:
第一個字節(jié)的范圍是0xA1(161)–0xF7(247) 媚创; 第二個字節(jié)的范圍是0xA1(161)–0xFE(254)
共收錄了6763個漢字渗钉,還包括拉丁字母、希臘字母钞钙、日文字符鳄橘。并對 ASCII 里已有的數(shù)字、標點芒炼、字母賦予了兩個字節(jié)的編碼瘫怜,這就是”全角”字符,而小于127的就稱為”半角”字符本刽。

GBK

由于GB2312僅包含了常用漢字鲸湃,沒有編碼生僻字以及繁體字,GBK就對其進行了擴展子寓。簡單地理解暗挑,只要第一個字節(jié)大于127,不管后面的字節(jié)是否大于127斜友,就是GBK編碼的字符炸裆。以下是兩個字節(jié)的具體范圍:
第一個字節(jié)的范圍是0x81(129)–0xFE(254) ; 第二個字節(jié)范圍一部分在0x40(64)–0x7E(126)鲜屏,另一部分在0x80(128)–0xFE(254)
這樣擴展之后的編碼方案被稱為 GBK 標準烹看,GBK包括了GB2312 的所有內(nèi)容,提供了23940個編碼洛史,使用了21886個惯殊。

中文編碼的存在價值

UTF-8編碼漢字通常需要三個字節(jié),而GBK只需要兩個字節(jié)也殖,所以對于純中文土思、不考慮國際化,且對流量和存儲大小比較敏感的應用忆嗜,可以使用GBK編碼節(jié)省存儲空間和傳輸流量己儒。

參考資料

  1. 字符編碼筆記:ASCII,Unicode和UTF-8 —— 阮一峰
  2. UTF-8 —— 維基百科
  3. 漢字內(nèi)碼擴展規(guī)范 —— 維基百科

博文發(fā)布在個人博客霎褐,歡迎訪問!该镣!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冻璃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌省艳,老刑警劉巖娘纷,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跋炕,居然都是意外死亡赖晶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門辐烂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遏插,“玉大人,你說我怎么就攤上這事纠修「斐埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵扣草,是天一觀的道長摧莽。 經(jīng)常有香客問我陨溅,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任鬼悠,我火速辦了婚禮,結果婚禮上亭珍,老公的妹妹穿的比我還像新娘镣丑。我一直安慰自己,他們只是感情好肴掷,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布敬锐。 她就那樣靜靜地躺著,像睡著了一般呆瞻。 火紅的嫁衣襯著肌膚如雪台夺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天痴脾,我揣著相機與錄音颤介,去河邊找鬼。 笑死赞赖,一個胖子當著我的面吹牛滚朵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播前域,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼辕近,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匿垄?” 一聲冷哼從身側響起移宅,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤归粉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漏峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糠悼,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年浅乔,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔喂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡靖苇,死狀恐怖席噩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾复,我是刑警寧澤班挖,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站芯砸,受9級特大地震影響萧芙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜假丧,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一双揪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧包帚,春花似錦渔期、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谋梭,卻和暖如春信峻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓮床。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工盹舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隘庄。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓踢步,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丑掺。 傳聞我的和親對象是個殘疾皇子获印,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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