漫畫:什麼是字符集和編碼?ASCII、UTF-8、UTF-16、UTF-32 又是什麼?
當天下午
————————
在計算機底層,比如說你的名字“小萌”在計算機中並不是文字的形式,而是一串二進位制數字,如“011001100110…”
人類只認識文字,可惜計算機只認 0 和 1,雙方都不能妥協,那就必須要有一個從文字到 0、1 的對映了。
從我們可以看到的文字到 0、1 的對映稱為編碼,反過來從 0、1 到文字叫解碼。這個就是編碼的含義。
因為計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用 8 個位元(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是 255(二進位制11111111=十進位制 255),0 - 255 被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為 ASCII 編碼,比如大寫字母 A 的編碼是 65,小寫字母 z 的編碼是 122。
Unicode 編碼定義了這個世界上幾乎所有字元(就是你眼睛看的字元,比如ABC、漢字等)的數字表示,而且 Unicode 還相容了很多老版本的編碼規範,例如剛剛講過的 ASCII 碼。
我們國家的每一個人都對應唯一的一個身份證號,而 Unicode 也為每個字元發了一張身份證,這張“身份證”上有一串唯一的數字 ID 確定了這個字元。
這串數字在整個計算機的世界具有唯一性,Unicode 給這串數字 ID 起了個名字叫[碼點]。
這個“Unicode 轉換格式”是為了解決“碼點”在計算機儲存方式而設計的。
“碼點”經過對映後得到的二進位制串的轉換格式單位稱之為“碼元”(Code Unit)。“碼點”就是一串二進位制數,“碼元”就是切分這個二進位制數的方法。
舉個例子,如果有一個字元的碼點二進位制表示有 n 位元組(n*8 個二進位制數),其碼元為 8 位(1 個位元組),那麼其擁有碼元 n 個。
Unicode 編碼發展到今天擴充套件到了 21 位,為啥擴充套件到 21 位了呢?因為一開始老美只考慮自己那 26 個英文字母和數字,隨著越來越多的國家的語言語言編碼,Unicode 不得繼續擴充套件,目前 21 位已經足夠使用。
UTF-32 是最好理解的一個了。UTF-32 也就是說它的碼元是 32 位,每 32 位去讀一下碼點,而碼點是 Unicode 給字元的編碼,前面也說了,最長才 21 位,因此每一個 UTF-32 值都可以直接表示對應的碼點。
什麼是編碼空間呢?前面說了 Unicode ,它是 21 位的。這 21 位提供了 1,114,112 個碼點,編碼空間就是對應這 1,114,112 個碼點。
對了這裡要說一下,這麼多碼點並不代表有這麼多字元,目前大概只有 10% 的空間被使用了,人類社會還沒創造出 1,114,112 這麼多的字元。
編碼空間被分成 17 個平面(plane),每個平面有 65,536 個字元(正好填充 2 個位元組,16 位)。0 號平面叫做“基本多文種平面”(BMP, Basic Multilingual Plane),涵蓋了幾乎所有你能遇到的字元,除了 emoji(emoji 位於 1 號平面 - -)。其它平面叫做補充平面,大多是空的。
UTF-16 要常見得多,它的碼元是 16 位的,也就是說每 16 位去讀一下碼點,獲取碼點的前 16 位數字,直到讀取完成。
編碼空間這裡要用上了哈,BMP 平面(也就是前面說的基本多文種平面)中的每一個碼點都直接與一個 UTF-16 的碼元一一對映。
由於 BMP 幾乎包括了所有常見字元,UTF-16 一般需要 UTF-32 大約一半的空間。至於其它平面裡很少使用的碼點都是用兩個 16 位的碼元來編碼的。
UTF-8 使用一到四個位元組來編碼一個碼點。從 0 到 127 的這些碼點直接對映成 1 個位元組(對於只包含這個範圍字元的文字來說,這一點使得 UTF-8 和 ASCII 完全相同)。接下來的 1,920 個碼點對映成 2 個位元組,在 BMP 裡所有剩下的碼點需要 3 個位元組。Unicode 的其他平面裡的碼點則需要 4 個位元組。UTF-8 是基於 8 位的碼元的,因此它並不需要關心位元組順序(因為位元組就是 8 位的呀,其它 UTF-16 和 UTF-32 在不同的機器編譯環境下需要考慮位元組的順序問題)。
作者:喬戈裡,哈工大計算機本碩,百度工程師,做公眾號就是想和大家交個朋友。
免責宣告:本文為作者投稿,內容版權歸作者所有,文中所使用卡通形象來源於網路,CSDN 釋出此文出於傳遞更多資訊之目的,CSDN 不因此向使用者承擔任何責任。
熱 文 推 薦
程式設計師有話說 | 大專生畢業 6 年月薪 3W+:不從眾也不普通
☞ 網友們票選的2018 Best Paper,你pick誰?
print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"
點選“閱讀原文”,開啟 CSDN App 閱讀更貼心!
喜歡就點選“好看”吧!相關文章
- 漫畫:什麼是機器學習機器學習
- 漫畫版:什麼是機器學習?機器學習
- 漫畫:什麼是氣泡排序?排序
- 漫畫:什麼是計數排序?排序
- 漫畫:什麼是單例模式?單例模式
- 漫畫 | 什麼是區塊鏈?區塊鏈
- 漫畫:什麼是大資料?大資料
- 漫畫:什麼是架構師架構
- 漫畫:什麼是人工智慧人工智慧
- 漫畫版:什麼是深度學習?深度學習
- 漫畫版:什麼是人工智慧?人工智慧
- 漫畫:什麼是LRU演算法?演算法
- 漫畫:什麼是HashMap?(底層原理)HashMap
- 漫畫:容器技術docker是什麼?Docker
- 漫畫:什麼是動態規劃?動態規劃
- 什麼是反向代理,什麼又是正向代理?
- 什麼是物理畫素、虛擬畫素、邏輯畫素、裝置畫素,什麼又是 PPI, DPI, DPR 和 DIP
- 什麼是Unicode,什麼是UTF-8Unicode
- 漫畫版:什麼是神經網路?神經網路
- 漫畫演算法:什麼是 B 樹?演算法
- 1.2什麼是軟體測試?目的又是什麼?
- 字元編碼發展史5 — UTF-16和UTF-32字元
- 漫畫 | 程式設計師的悲哀是什麼?程式設計師
- 用漫畫的形式展現——什麼是webWeb
- 漫畫演算法:什麼是跳躍表?演算法
- 檢查字串的byte[]是什麼編碼字符集字串
- 漫畫 | 到底是什麼讓IT人如此苦逼???
- Unicode 和 UTF-8 是什麼關係?Unicode
- 字元編碼:ASCII,Unicode和UTF-8字元ASCIIUnicode
- 漫畫演算法:輾轉相除法是什麼鬼?演算法
- 瀏覽器快取是什麼?它的機制又是什麼?瀏覽器快取
- 什麼是組態軟體?Web組態軟體又是什麼?Web
- 什麼是資料監控?其4大意義又是什麼?
- REST是什麼?RESTFul又是什麼?這二者的關係是怎樣的?REST
- 字元編碼:Unicode & UTF-16 & UTF-8字元Unicode
- 字元編碼筆記:ASCII,Unicode和UTF-8字元筆記ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode 和 UTF-8字元筆記ASCIIUnicode
- 什麼是視訊編碼(Codec)?