幾種常見的編碼格式對比

ASCII(American Standard Code for Information Interchange篓吁,美國信息交換標(biāo)準(zhǔn)代碼):

它是現(xiàn)今最早最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646,其中一個英文字母(不分大小寫)占一個字節(jié)的空間枷莉。

引申:字節(jié)是指一小組相鄰的二進制數(shù)碼徒仓。通常是8位作為一個字節(jié),如00001111,換算為十進制趁冈。最小值-128,最大值127。

標(biāo)準(zhǔn)ASCII 碼也叫基礎(chǔ)ASCII碼渗勘,使用7 位二進制數(shù)(剩下的1位二進制為0)來表示所有的大寫和小寫字母沐绒,數(shù)字0 到9、標(biāo)點符號旺坠, 以及在美式英語中使用的特殊控制字符乔遮。其中:

1)0~31及127(共33個)是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)取刃、CR(回車)蹋肮、FF(換頁)、DEL(刪除)璧疗、BS(退格)坯辩、BEL(響鈴)等;通信專用字符:SOH(文頭)崩侠、EOT(文尾)漆魔、ACK(確認(rèn))等;ASCII值為8却音、9改抡、10 和13 分別轉(zhuǎn)換為退格、制表僧家、換行和回車字符雀摘。它們并沒有特定的圖形顯示,但會依不同的應(yīng)用程序八拱,而對文本顯示有不同的影響阵赠。

2)32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯?dāng)?shù)字肌稻。

3)65~90為26個大寫英文字母清蚀,97~122號為26個小寫英文字母,其余為一些標(biāo)點符號爹谭、運算符號等枷邪。

同時還要注意,在標(biāo)準(zhǔn)ASCII中诺凡,其最高位(b7)用作奇偶校驗位东揣。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現(xiàn)錯誤的一種方法腹泌,一般分奇校驗和偶校驗兩種嘶卧。奇校驗規(guī)定:正確的代碼一個字節(jié)中1的個數(shù)必須是奇數(shù),若非奇數(shù)凉袱,則在最高位b7添1芥吟;偶校驗規(guī)定:正確的代碼一個字節(jié)中1的個數(shù)必須是偶數(shù)侦铜,若非偶數(shù),則在最高位b7添1钟鸵。

ASCII碼表:http://tool.oschina.net/commons?type=4

GB2312(《信息交換用漢字編碼字符集》)

是由中國國家標(biāo)準(zhǔn)總局1980年發(fā)布钉稍,1981年5月1日開始實施的一套國家標(biāo)準(zhǔn),標(biāo)準(zhǔn)號是GB2312—1980棺耍。

GB2312編碼適用于漢字處理贡未、漢字通信等系統(tǒng)之間的信息交換,通行于中國大陸烈掠;新加坡等地也采用此編碼羞秤。中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持GB2312。GB2312標(biāo)準(zhǔn)共收錄6763個漢字左敌,基本滿足了漢字的計算機處理需要瘾蛋,它所收錄的漢字已經(jīng)覆蓋中國大陸99.75%的使用頻率。對于人名矫限、古漢語等方面出現(xiàn)的罕用字哺哼,GB2312不能處理,這導(dǎo)致了后來GBK及GB 18030漢字字符集的出現(xiàn)叼风。

1)GB2312用一個字節(jié)表示一個英文字符和一些基本符號和半角符號取董,用兩個字節(jié)表示一個漢字和全角符號和一些我們?nèi)粘J褂玫姆枴?/p>

2)GB2312利用了ASCII的127個字符之后空余的部分,增添了6000多種常用漢字无宿。

3)數(shù)值小于127的字節(jié)表示ASCII中原有字符茵汰,兩個連續(xù)數(shù)值都大于127的字節(jié)表示一個漢字字符。

4)使用GB2312編碼孽鸡,當(dāng)讀取到一個數(shù)值上小于127的字節(jié)時當(dāng)作一個ASCII中原有的字符處理蹂午。讀到一個數(shù)值大于127的字節(jié)時會繼續(xù)讀取下一個字節(jié),下一個字節(jié)的數(shù)值也必定是大于127彬碱,將兩個大于127的字節(jié)一起組合形成一個字符豆胸。

5)每個漢字及符號以兩個字節(jié)來表示。第一個字節(jié)稱為“高位字節(jié)”(也稱“區(qū)字節(jié))”巷疼,第二個字節(jié)稱為“低位字節(jié)”(也稱“位字節(jié)”)晚胡,例如“啊”字在大多數(shù)程序中,會以兩個字節(jié)嚼沿,0xB0(第一個字節(jié)) 0xA1(第二個字節(jié))儲存估盘。

GB2312碼表:http://tools.jb51.net/table/gb2312

GBK(《通用多八位編碼字符集》)

GB2312有局限性,只能表示6000個字符骡尽,GBK是對GB2312的升級忿檩,共收錄了21003個漢字,GBK與GB2312非常相似爆阶,唯一的不同:

使用GBK編碼,當(dāng)讀取到一個數(shù)值上小于127的字節(jié)時當(dāng)作一個ASCII中原有的字符處理。讀到一個數(shù)值大于127的字節(jié)時必定會繼續(xù)讀取下一個字節(jié)辨图,下一個字節(jié)的數(shù)值無需大于127班套,將兩個字節(jié)一起組合形成一個漢字字符。

GBK 向下與 GB2312 編碼兼容故河,向上支持 ISO 10646.1國際標(biāo)準(zhǔn)吱韭,ISO 10646 是國際化標(biāo)準(zhǔn)組織 ISO 公布的一個編碼標(biāo)準(zhǔn),大陸譯為《通用多八位編碼字符集》,ISO 10646.1 是該標(biāo)準(zhǔn)的第一部分《體系結(jié)構(gòu)與基本多文種平面》。我國 1993 年以 GB 13000.1 國家標(biāo)準(zhǔn)的形式予以認(rèn)可(即 GB 13000.1 等同于 ISO 10646.1)鱼的。

Unicode(Universal Multiple-Octet Coded Character Set理盆,簡稱:UC)

unicode編碼表中包含了世界上所有國家的所有字符和符號的編碼。 在最新的規(guī)范中凑阶,所有的字符一概使用四個字節(jié)表示猿规,不夠的就往前面補 0。這樣確實可以解決編碼問題宙橱,但是卻造成了空間的極大浪費姨俩,如果是一個英文文檔,那文件大小就大出了 3 倍师郑,這顯然是無法接受的环葵。

于是,為了較好的解決 Unicode 的編碼問題宝冕, UTF-8 和 UTF-16 兩種當(dāng)前比較流行的編碼方式誕生了张遭。當(dāng)然還有一個 UTF-32 的編碼方式,也就是上述那種定長編碼地梨,字符統(tǒng)一使用 4 個字節(jié)菊卷,雖然看似方便,但是卻不如另外兩種編碼方式使用廣泛湿刽。

UTF-8

UTF-8 是目前互聯(lián)網(wǎng)上使用最廣泛的一種 Unicode 編碼方式的烁,它的最大特點就是可變長。它可以使用 1 - 4 個字節(jié)表示一個字符诈闺,根據(jù)字符的不同變換長度渴庆。編碼規(guī)則如下:

1)對于單個字節(jié)的字符,第一位設(shè)為 0雅镊,后面的 7 位對應(yīng)這個字符的 Unicode 碼點襟雷。因此,對于英文中的 0 - 127 號字符仁烹,與 ASCII 碼完全相同耸弄。這意味著 ASCII 碼那個年代的文檔用 UTF-8 編碼打開完全沒有問題。

2)對于需要使用 N 個字節(jié)來表示的字符(N > 1)卓缰,第一個字節(jié)的前 N 位都設(shè)為 1计呈,第 N + 1 位設(shè)為0砰诵,剩余的 N - 1 個字節(jié)的前兩位都設(shè)位 10,剩下的二進制位則使用這個字符的 Unicode 碼點來填充捌显。

序號 Unicode UTF-8
1 0000 0000 - 0000 007F 0xxxxxxx
2 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
3 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

下面以漢字“漢”為利茁彭,具體說明如何進行 UTF-8 編碼和解碼,大家就很容易理解了扶歪。

“漢”的 Unicode 碼點是 0x6c49(110 1100 0100 1001)理肺,通過上面的對照表可以發(fā)現(xiàn),0x0000 6c49 位于第三行的范圍善镰,那么得出其格式為 1110xxxx 10xxxxxx 10xxxxxx妹萨。接著,從“漢”的二進制數(shù)最后一位開始炫欺,從后向前依次填充對應(yīng)格式中的 x乎完,多出的 x 用 0 補上。這樣竣稽,就得到了“漢”的 UTF-8 編碼為 11100110 10110001 10001001囱怕,轉(zhuǎn)換成十六進制就是 0xE6 0xB7 0x89。

UTF-16

在了解 UTF-16 編碼方式之前毫别,先了解一下另外一個概念——“平面”娃弓。

在上面的介紹中,提到了 Unicode 是一本很厚的字典岛宦,她將全世界所有的字符定義在一個集合里台丛。這么多的字符不是一次性定義的,而是分區(qū)定義砾肺。每個區(qū)可以存放 65536 個(216216)字符挽霉,稱為一個平面(plane)。目前变汪,一共有 17 個(2525)平面侠坎,也就是說,整個 Unicode 字符集的大小現(xiàn)在是 221221裙盾。

最前面的 65536 個字符位实胸,稱為基本平面(簡稱 BMP ),它的碼點范圍是從 0 到 216?1216?1番官,寫成 16 進制就是從 U+0000 到 U+FFFF庐完。所有最常見的字符都放在這個平面,這是 Unicode 最先定義和公布的一個平面徘熔。剩下的字符都放在輔助平面(簡稱 SMP )门躯,碼點范圍從 U+010000 到 U+10FFFF。

基本了解了平面的概念后酷师,再說回到 UTF-16讶凉。UTF-16 編碼介于 UTF-32 與 UTF-8 之間染乌,同時結(jié)合了定長和變長兩種編碼方法的特點。它的編碼規(guī)則很簡單:基本平面的字符占用 2 個字節(jié)缀遍,輔助平面的字符占用 4 個字節(jié)慕匠。也就是說,UTF-16 的編碼長度要么是 2 個字節(jié)(U+0000 到 U+FFFF)域醇,要么是 4 個字節(jié)(U+010000 到 U+10FFFF)。那么問題來了蓉媳,當(dāng)我們遇到兩個字節(jié)時譬挚,到底是把這兩個字節(jié)當(dāng)作一個字符還是與后面的兩個字節(jié)一起當(dāng)作一個字符呢?

這里有一個很巧妙的地方酪呻,在基本平面內(nèi)减宣,從 U+D800 到 U+DFFF 是一個空段,即這些碼點不對應(yīng)任何字符玩荠。因此漆腌,這個空段可以用來映射輔助平面的字符。

輔助平面的字符位共有 220220 個阶冈,因此表示這些字符至少需要 20 個二進制位闷尿。UTF-16 將這 20 個二進制位分成兩半,前 10 位映射在 U+D800 到 U+DBFF女坑,稱為高位(H)填具,后 10 位映射在 U+DC00 到 U+DFFF,稱為低位(L)匆骗。這意味著劳景,一個輔助平面的字符,被拆成兩個基本平面的字符表示碉就。

因此盟广,當(dāng)我們遇到兩個字節(jié),發(fā)現(xiàn)它的碼點在 U+D800 到 U+DBFF 之間瓮钥,就可以斷定筋量,緊跟在后面的兩個字節(jié)的碼點,應(yīng)該在 U+DC00 到 U+DFFF 之間骏庸,這四個字節(jié)必須放在一起解讀毛甲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市具被,隨后出現(xiàn)的幾起案子玻募,更是在濱河造成了極大的恐慌,老刑警劉巖一姿,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件七咧,死亡現(xiàn)場離奇詭異跃惫,居然都是意外死亡,警方通過查閱死者的電腦和手機艾栋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門爆存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝗砾,你說我怎么就攤上這事先较。” “怎么了悼粮?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵闲勺,是天一觀的道長。 經(jīng)常有香客問我扣猫,道長菜循,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任申尤,我火速辦了婚禮癌幕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昧穿。我一直安慰自己勺远,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般扼鞋。 火紅的嫁衣襯著肌膚如雪粪狼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死某筐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冠跷。 我是一名探鬼主播南誊,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜜托!你這毒婦竟也來了抄囚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤橄务,失蹤者是張志新(化名)和其女友劉穎幔托,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡重挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年嗓化,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬哀。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡刺覆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出史煎,到底是詐尸還是另有隱情谦屑,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布篇梭,位于F島的核電站伦仍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏很洋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一隧枫、第九天 我趴在偏房一處隱蔽的房頂上張望喉磁。 院中可真熱鬧,春花似錦官脓、人聲如沸协怒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孕暇。三九已至,卻和暖如春赤兴,著一層夾襖步出監(jiān)牢的瞬間妖滔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工桶良, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留座舍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓陨帆,卻偏偏與公主長得像曲秉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疲牵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 字符是用戶可以讀寫的最小單位纲爸。計算機所能支持的字符組成的集合亥鸠,就叫做字符集。字符集通常以二維表的形式存在缩焦。二維表的...
    劉惜有閱讀 8,131評論 2 14
  • 歸屬感、價值感 人是社會性的盖桥、群居的灾螃、合作的,因為只有這樣揩徊,人類才能生存腰鬼。 人出生時需要其它人的幫助才能存活,所以...
    寒媽閱讀 383評論 0 2
  • 中華文明淵遠(yuǎn)流長彼硫,中國文化博大精深,漢語意思微妙深奧凌箕,所以聽國人說話就特別的耐人尋味拧篮,說話人貌似極簡單的一句話,聽...
    安子覓閱讀 2,190評論 4 16
  • 今天下午回家兒子又寫完作業(yè)了,就是沒帶語文課本芜壁,幸虧老師在群里發(fā)了礁凡,才讀的。不過慧妄,兒子的讀音比我準(zhǔn)多了顷牌,我覺得得他...
    王一碩閱讀 213評論 0 0
  • 雨夾雪 是夾心的棉花糖 夾心太甜化了棉花 雪花 不能捧在手心里 也不能把她關(guān)在溫室 愛得炙熱她就化了 雪景 是大地...
    閱樂ing閱讀 110評論 0 1