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