计算机字符编码方式
📑來(lái)源
本文圖片均收集自網(wǎng)絡(luò)
?推薦
建議觀看以下計(jì)算機(jī)字符編碼方式科普視頻
《錕斤拷是怎樣煉成的——中文顯示“入”門(mén)指南【柴知道】》,bilibili @ 柴知道
https://www.bilibili.com/video/BV1cB4y177QR
《你懂亂碼嗎?錕斤拷燙燙燙(詳解 ASCII、Unicode、UTF-32、UTF-8編碼)》,bilibili @ 林粒粒呀
https://www.bilibili.com/video/BV1xP4y1J7CS
基礎(chǔ)概念
字符和字符集
**字符(character)**可以簡(jiǎn)單地理解為計(jì)算機(jī)表示信息的單位
像符號(hào)、數(shù)字、字母、文字、emoji 表情等肉眼能直接看見(jiàn)的文本或表情都是可見(jiàn)字符(打印字符)
像換行、回車(chē)、換頁(yè)等肉眼不可見(jiàn),但是卻能對(duì)文本進(jìn)行控制的不可見(jiàn)字符(控制字符)
不可見(jiàn)字符中,空格、回車(chē)、換行、水平制表、垂直制表還被稱(chēng)為空白字符
**字符集(character set)**就是字符的集合,如常見(jiàn)的 ASCII 字符集,GB2312 字符集,Unicode 字符集等
編號(hào)和編碼
一個(gè)字符集會(huì)給每個(gè)字符都規(guī)定個(gè)數(shù)字編號(hào)
由于計(jì)算機(jī)只能識(shí)別 0 和 1,因而在計(jì)算機(jī)內(nèi)部,所有的信息最終都表示為一個(gè)二進(jìn)制串,比如 100111101100000,每一個(gè)二進(jìn)制位(bit)有 0 和 1 兩種狀態(tài),而將字符對(duì)應(yīng)到一個(gè)二進(jìn)制串的過(guò)程,叫做字符編碼(character encoding)
💬注釋
下文如無(wú)特殊說(shuō)明,出于方便,編碼均采用 16 進(jìn)制數(shù)字進(jìn)行表示,但實(shí)際上最終存儲(chǔ)在計(jì)算機(jī)中還是 2 進(jìn)制的數(shù)字
一般對(duì)于比較小的字符集不用考慮太多,一個(gè)字符集就只有一種編碼方式,只要轉(zhuǎn)換成二進(jìn)制,一個(gè)字符的編號(hào)就是它的編碼。但對(duì)像 Unicode 這種比較大的字符集就不一定是了,它有著多種編碼方式,編號(hào)也不等于編碼
字符集發(fā)展史
字符集有一個(gè)發(fā)展歷史,ASCII 是最早出現(xiàn)的字符集,僅含有 128 個(gè)字符,但局限于英文字母和部分符號(hào),無(wú)法適用于非英語(yǔ)國(guó)家和地區(qū),即便是后來(lái)拓充成 ASICII 字符集也不夠用
后來(lái)各個(gè)國(guó)家和地區(qū)都推出了自己的字符集,如中國(guó)大陸推出 GB2312、GBK、GB18030,中國(guó)港澳臺(tái)地區(qū)推出 Big5 等
但各地標(biāo)準(zhǔn)不統(tǒng)一,同一個(gè)編碼在不同字符集里對(duì)應(yīng)的很可能是完全不同的字符,這就導(dǎo)致亂碼現(xiàn)象,最終才出現(xiàn)相關(guān)組織意推出囊括全球的大一統(tǒng)字符集 UCS 和 Unicode
目前主流的字符集是 Unicode,采取 UTF-8 編碼方式
GB2312、GBK、GB18030
發(fā)展歷史
其實(shí)“GB”就是“國(guó)標(biāo)”,“K”就是“擴(kuò)”的意思
- 1980年, GB2312-80(我國(guó)的第一套漢字集標(biāo)準(zhǔn)),共包含7445個(gè)字符,其中6763個(gè)常用漢字
- 1995年,GBK,由GB2312-80(和港、臺(tái)兩種標(biāo)準(zhǔn))擴(kuò)展而來(lái),共包含21886個(gè)字符,其中常用漢字14240個(gè)
- 2000年,GB18030-2000編碼標(biāo)準(zhǔn)是由信息產(chǎn)業(yè)部和國(guó)家質(zhì)量技術(shù)監(jiān)督局在2000年3月17日聯(lián)合發(fā)布的,并且作為一項(xiàng)國(guó)家標(biāo)準(zhǔn)在2001年的1月正式強(qiáng)制執(zhí)行;增加了6351個(gè)字符,其中一部分為4字節(jié)字(four-byte encoding range)
- 2005年,GB18030-2005《信息技術(shù)中文編碼字符集》是中國(guó)制訂的以漢字為主并包含多種中國(guó)少數(shù)民族文字(如藏、蒙古、傣、彝、朝鮮、維吾爾文等)的超大型中文編碼字符集強(qiáng)制性標(biāo)準(zhǔn),其中收入漢字70000余個(gè)
GB2312 收錄的是最常用的漢字,可以說(shuō)我們用到的 99% 的漢字,都屬于 GB2312 編碼范圍
目前用的最為廣泛的中文字符集是 GBK
編碼方式
📑對(duì)應(yīng)
GB2312、GBK、GB18030 編碼知識(shí)均學(xué)習(xí)自《徹底搞明白 GB2312、GBK 和 GB18030》
https://zhuanlan.zhihu.com/p/453675608
GB2312 把每個(gè)漢字都編碼成兩個(gè)字節(jié),第一個(gè)字節(jié)稱(chēng)為"高位字節(jié)",第二個(gè)字節(jié)稱(chēng)為"低位字節(jié)"
平常說(shuō)的“英文字母單字節(jié),中文漢字雙字節(jié)”就出自于此
“半角”和“全角”的概念也出自于此,“半角”是占單字節(jié)的字符,“全角”是占雙字節(jié)的字符,中文由于全是雙字節(jié)因而沒(méi)有半角和全角的區(qū)別,或者說(shuō)中文全是全角。但英文和部分標(biāo)點(diǎn)符號(hào)有半角和全角的區(qū)別,全角的英文和部分標(biāo)點(diǎn)符號(hào)顯示表現(xiàn)為更“胖”了
GBK 也是把每個(gè)漢字都編碼成兩個(gè)字節(jié),但編碼范圍更廣,涵蓋字符數(shù)量更多
GB18030 是變長(zhǎng)多字節(jié)編碼,每個(gè)字或字符可以由一個(gè),兩個(gè)或四個(gè)字節(jié)組成
GB2312、GBK、GB18030 依次在前者的基礎(chǔ)上擴(kuò)充而來(lái),因而都能向前兼容
Unicode
Unicode,也被稱(chēng)為萬(wàn)國(guó)碼、統(tǒng)一碼
狹義的 Unicode 就只是字符集,廣義的 Unicode 是一套標(biāo)準(zhǔn),包括了字符集和編碼規(guī)則
Unicode 規(guī)定了每個(gè)字符的數(shù)字編號(hào),這個(gè) Unicode 編號(hào)被稱(chēng)為碼點(diǎn)(code point)或碼位(code position),通常在編號(hào)前面加上"U+"表示是 Unicode 的編號(hào)
Unicode 的實(shí)現(xiàn)方式,也就是編碼方式,被稱(chēng)為 Unicode 轉(zhuǎn)換格式(Unicode Transformation Format,UTF),目前有 UTF-8、UTF-16、UTF-32 幾套方案
考慮到存儲(chǔ)空間、格式識(shí)別等一系列因素,碼點(diǎn)一般都不等于編碼,需要進(jìn)行一定的處理才形成編碼
如對(duì)于字符“你”而言
| 4F60 | E4 BD A0 | 4F 60 | 00 00 4F 60 |
💬相關(guān)
Unicode 字符百科
https://unicode-table.com/cn/blocks/
編碼方式
📑對(duì)應(yīng)
Unicode 編碼知識(shí)部分學(xué)習(xí)自《UTF8、UTF16、UTF32區(qū)別》
https://blog.csdn.net/zhaohong_bo/article/details/89196938
UTF-8:當(dāng)編碼為一個(gè)字節(jié),則設(shè)最高比特位為 0,當(dāng)編碼超過(guò)一個(gè)字節(jié),則需要幾個(gè)字節(jié),就在第一個(gè)字節(jié)從最高位開(kāi)始令連續(xù)的幾個(gè)比特位為 1,之后的字節(jié)最高位為 10
UTF-16:使用2或4個(gè)字節(jié)進(jìn)行存儲(chǔ)。對(duì)于 Unicode 編號(hào)范圍在 0~FFFF 之間的字符,統(tǒng)一用兩個(gè)字節(jié)存儲(chǔ),無(wú)需字符轉(zhuǎn)換,直接存儲(chǔ) Unicode 編號(hào)。對(duì)于 Unicode 字符編號(hào)在 10000-10FFFF 之間的字符,UTF-16 用四個(gè)字節(jié)存儲(chǔ)
UTF-32:用固定長(zhǎng)度的字節(jié)存儲(chǔ)字符編碼,不管 Unicode 字符編號(hào)需要幾個(gè)字節(jié),全部都用 4 個(gè)字節(jié)存儲(chǔ),直接存儲(chǔ)Unicode 編號(hào)
平面
目前的 Unicode 字符分為 17 組編排,每組稱(chēng)為一個(gè)平面(Plane),而每平面擁有 65536(即 21?)個(gè)碼點(diǎn)
每個(gè)平面還根據(jù)用途劃分成若干個(gè)區(qū)塊(Block),區(qū)塊相當(dāng)于把同類(lèi)字符放在一起,方便檢索和補(bǔ)充
而首個(gè) 16 位統(tǒng)一碼字符的平面稱(chēng)為基本多文種平面(BMP),寫(xiě)成 16 進(jìn)制就是從 U+0000 到 U+FFFF,剩下還有 16 個(gè)輔助平面(SMP),碼點(diǎn)范圍從 U+010000 一直到 U+10FFFF,絕大部分的常見(jiàn)字符都在首個(gè)平面
這 17 個(gè)平面結(jié)合起來(lái)至少需要占據(jù) 21 位的空間,也就是差不多 3 個(gè)字節(jié)(24 位),而輔助平面實(shí)際上是用 4 個(gè)字節(jié)表示,方便以后向后擴(kuò)展。
-
第 0 平面稱(chēng)為BMP(Basic Multilingual Plane)平面,又稱(chēng)為基本多文種平面
-
第 1 輔助平面稱(chēng)為 SMP(Supplementary Multilingual Plane)平面,又稱(chēng)為多文種補(bǔ)充平面,主要擺放拼音文字及符號(hào)
-
第 2 輔助平面稱(chēng)為 SIP(Supplementary Ideographic Plane)平面,又稱(chēng)為表意文字補(bǔ)充平面,其范圍為 20000-2FFFF。
-
第 3 輔助平面稱(chēng)為 TIP(Tertiary Ideographic Plane)平面,又稱(chēng)為表意文字第三平面,其范圍為 30000-3FFFF
-
第 4 至 13 輔助平面尚未使用
-
第 14 輔助平面稱(chēng)為 SSP(Supplementary Special-purpose Plane)平面,又稱(chēng)為特殊用途補(bǔ)充平面,擺放語(yǔ)言標(biāo)簽(Language Tags)和異體字選擇器(Variation Selectors),這些都是控制字符,其范圍為 E0000-EFFFF
-
第 15 輔助平面為補(bǔ)充私人使用區(qū)-A (Supplementary Private Use Area-A),其范圍為 F0000-FFFFF
-
第 16 輔助平面為補(bǔ)充私人使用區(qū)-B(Supplementary Private Use Area-B),其范圍為 100000-10FFFF
emoji
emoji 表情也可以被稱(chēng)作繪文字、彩色象形字符,算是一類(lèi)特殊的字符,如 。最開(kāi)始的 emoji 源于日語(yǔ)“絵文字”,是日本手機(jī)使用的表情,后來(lái)才被部分收錄進(jìn) Unicode 字符集
起初,Unicode 中的 emoji 表情只有黑色,而隨著 emoji 表情的發(fā)展,越來(lái)越多 emoji 表情開(kāi)始有了彩色版本
此處額外提及一下另一個(gè)詞“顏文字”,源于日語(yǔ)“顔文字(kaomoji)”,顏文字是指用若干個(gè)字符排列成表情的樣子,如 O(∩_∩)O ,和 emoji 表情完全不是一個(gè)概念,但有的地方會(huì)把二者混為一談
💬相關(guān)
目前 Unicode 中收錄的所有 emoji 表情
https://www.unicode.org/emoji/charts/emoji-list.html
各版本 Unicode 中收錄的 emoji 表情的相關(guān)數(shù)據(jù)
https://unicode.org/Public/emoji/
Unicode 只是規(guī)定了 emoji 的碼點(diǎn)和含義,并沒(méi)有規(guī)定它具體表現(xiàn)成什么形式,Unicode 聯(lián)盟主要負(fù)責(zé)的就是 emoji 的審核、管理和編碼等工作,而設(shè)計(jì) emoji 外觀的任務(wù)則交到了各平臺(tái)手里
有的平臺(tái)出于規(guī)避版權(quán)風(fēng)險(xiǎn),有的平臺(tái)出于自己的設(shè)計(jì)理論、品牌風(fēng)格來(lái)重新設(shè)計(jì) Emoji 表情。比如有的 Emoji 表情富有立體感,并含有著漸變和陰影的細(xì)節(jié),有的 Emoji 表情趨于扁平簡(jiǎn)約化
因而發(fā)出去同個(gè) emoji 表情(同個(gè)碼位),在不同平臺(tái)上看到的樣式可能是截然不同的
💬相關(guān)
emoji 的百科網(wǎng)站
網(wǎng)站 Emojipedia
https://emojipedia.org/zh/
網(wǎng)站 EmojiXD
https://emojixd.com/
網(wǎng)站 EMOJIALL
https://www.emojiall.com/zh-hans
輸入
emoji 表情沒(méi)有辦法直接通過(guò)鍵盤(pán)輸入,但可以通過(guò)復(fù)制粘貼,或通過(guò)碼點(diǎn)輸入 emoji 表情(對(duì)于其他 Unicode 字符也同樣適用)
- dddd是十進(jìn)制碼點(diǎn),hhhh 是十六進(jìn)制碼點(diǎn)
- 在 HTML 中,可以寫(xiě)成 HTML 實(shí)體 &#dddd; 或 &#xhhhh;
- 在 CSS 中,可以寫(xiě)成 \hhhh
- 在 JavaScript 中,可以寫(xiě)成 \uhhhh
- 在部分平臺(tái)上(如 GitHub、Slack 等),可以使用 emoji 簡(jiǎn)短代碼(Emoji Shortcode)
- 有的平臺(tái)可能會(huì)有特定的快捷輸入 emoji 的方式
以 emoji 表情為例,可以將其碼點(diǎn) U+1F600 寫(xiě)成 HTML 形式 😀(十進(jìn)制)或 😀(十六進(jìn)制),CSS 形式 \1F600,JavaScript 形式 \uD83D\uDE00(輔助平面的字符需借助 UTF-16 編碼成 8 位),在部分平臺(tái)上簡(jiǎn)短代碼 :grinning:,
💬相關(guān)
emoji 簡(jiǎn)短代碼介紹
https://www.emojiall.com/zh-hans/help-shortcode
微信快捷輸入 emoji 表情方法
https://www.emojiall.com/zh-hans/platform-wechat
序列
📑對(duì)應(yīng)
emoji 序列相關(guān)知識(shí)學(xué)習(xí)自《emoji 編碼規(guī)則介紹》
https://blog.csdn.net/chriscross/article/details/104746788
一個(gè) emoji 表情,通常由一個(gè) Unicode 碼點(diǎn)表示,但也可以由多個(gè) Unicode 碼點(diǎn)組合成一個(gè)序列表示
但由于并不是所有的系統(tǒng)都支持最新的 emoji 標(biāo)準(zhǔn),因而在有的系統(tǒng)上,多個(gè) Unicode 碼點(diǎn)組合成一個(gè)序列表示 emoji 表情會(huì)被拆成多個(gè) emoji 表情進(jìn)行顯示
表示序列
有些字符,它既可以顯示成黑白文本,也可以顯示成彩色 emoji 表情,有的默認(rèn)顯示為前者,有的默認(rèn)顯示為后者,此處列舉幾個(gè)
表示序列(emoji presentation sequence),用于說(shuō)明一個(gè)字符顯示為文本還是 emoji 表情
如果一個(gè)字符后面加上 U+FE0E,那么它就作為文本顯示
如果一個(gè)字符后面加上 U+FE0F,那么它就作為 emoji 表情顯示
📋格式
基礎(chǔ)字符 + 顯示方式 = 文本/emoji表情
📝例子
?(U+26C4) + U+FE0E = ??(U+26C4 U+FE0E)
📝例子
修飾序列
修飾序列(emoji modifier sequence),由一個(gè)基礎(chǔ)字符(base)和一個(gè)修飾字符(modifier)組成,主要用來(lái)修改 emoji 表情中人的膚色
📋格式
基礎(chǔ) emoji 表情 + 膚色 = 對(duì)應(yīng)膚色的 emoji 表情
📝例子
🧑(U+1F9D1) + 🏾(U+1F3FE) = 👨🏾(U+1F9D1 U+1F3FE)
💬相關(guān)
emoji 膚色類(lèi)型
https://www.arpansa.gov.au/sites/default/files/legacy/pubs/RadiationProtection/FitzpatrickSkinType.pdf
旗幟序列
旗幟序列(emoji flag sequence)
📋格式
區(qū)域指標(biāo)字母1 + 區(qū)域指標(biāo)字母2 = 2個(gè)字母組成的國(guó)家碼對(duì)應(yīng)的國(guó)旗
📝例子
🇨(U+1F1E8) + 🇳(U+1F1F3) = 🇨🇳(U+1F1E8 U+1F1F3)
鍵盤(pán)序列
鍵盤(pán)序列(emoji keycap sequence)
📋格式
數(shù)字 + U+FE0E + 方框 = 數(shù)字鍵盤(pán)
📝例子
2(U+0032) + U+FE0F + ? (U+20E3) = 2?? (U+0032 U+FE0F U+20E3)
零寬連接序列
零寬連接序列(emoji zero width joint sequence),通過(guò) ZWJ 等寬連接符(U+200D),對(duì)多個(gè) emoji 表情進(jìn)行組合
目前有 5 種組合方式
📋格式
emoji 表情1 + U+200D + emoji 表情2 = 合成 emoji 表情
📝例子
👨?(U+1F468) + U+200D + 👩?(U+1F469) + U+200D + 👧?(U+1F467)= 👨?👩?👧?(U+1F468 U+200D U+1F469 U+200D U+1F467)
總結(jié)
- 上一篇: 为操作系统减肥(使用一键还原精灵前的步骤
- 下一篇: 儿童场景英语品牌“麦禾教育”完成天使轮融