喬哥:小萌,聽說你去面試了,怎麼樣啊?
小萌:哎…喬哥,你給我講講什麼是字符集和編碼唄,ascii,utf-8,utf-16,utf-32又是啥?
喬哥:好的,在搞懂字符集先來講講什麼是編碼吧~
在計算機底層,比如說你的名字「小萌」在計算機中並不是文字的形式,而是一串二進位制數字,如「011001100110…」
人類只認識文字,可惜計算機只認0和1,雙方都不能妥協,那就必須要有乙個從文字到0、1的映**。
從我們可以看到的文字到0、1的對映稱為編碼,反過來從0、1到文字叫解碼。這個就是編碼的含義。
小萌:原來編碼是這意思,那啥是字符集呀?
喬哥:ascii,utf-8,utf-16,utf-32這些就是字符集,字元的集合嗎~
小萌: ascii,utf-8,utf-16,utf-32這些又是啥意思呀?
喬哥:首先說一下ascii碼的意思吧。
因為計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元(bit)作為乙個位元組(byte),所以,乙個位元組能表示的最大的整數就是255(二進位制11111111=十進位制255),0-255被用來表示大小寫英文本母、數字和一些符號,這個編碼表被稱為ascii編碼,比如大寫字母a的編碼是65,小寫字母z的編碼是122。
小萌:這是ascii編碼我知道了,那漢字用啥表示呢?
喬哥:因為計算機一開始是老美發明的,沒考慮其他國家的字元,所以,中國制定了gb2312編碼,用來把中文編進去。類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,unicode應運而生。
小萌:咋又跑出來個unicode?我之前那些還沒搞懂呢!
喬哥:別著急,講utf-8,utf-16,utf-32還真離不開unicode。
unicode編碼定義了這個世界上幾乎所有字元(就是你眼睛看的字元比如abc,漢字等)的數字表示,而且unicode還相容了很多老版本的編碼規範,例如剛剛講過的ascii碼。
我們國家的每乙個人都對應唯一的乙個身份證號,而unicode也為每乙個字元發了一張身份證,這張「身份證」上有一串唯一的數字id確定了這個字元。
這串數字在整個計算機的世界上具有唯一性,unicode給這串數字id起了個名字叫[碼點]。
喬哥:很多人說的編碼其實是想表達unicode轉換格式(即utf,unicode transformation formats)
小萌:哇,utf,那utf-8,utf-16,utf-32裡面的utf和你說的那個utf是不是一回事
喬哥:小萌厲害啊!我說的utf就是utf-8這些編碼的字首。
這個[unicode 轉換格式] 的是為了解決[碼點]在計算機儲存方式而設計的。
[碼點]經過對映後得到二進位制的轉換格式單位稱之為[碼元](code unit)。[碼點]就是一串二進位制數,【碼元】就是切分這個二進位制數的方法。
舉個例子,如果有乙個字元的碼點二進位制表示有n位元組(n*8個二進位制數),其碼元為8位(1個位元組),那麼其擁有碼元n個。
小萌:那意思就是說utf-8就是每讀碼點的8位數就代表乙個字元,utf-16就是每讀碼點的16位代表乙個字元了咯?
喬哥:emmm…你可以這麼理解
小萌:喬哥,能詳細講講utf-8,utf-16,utf-32嗎?
喬哥:好的,我本來也還想繼續講的,先來講一講utf-32。
unicode編碼發展到今天擴充套件到21位,為啥擴充套件到21位了呢?因為一開始老美值考慮自己那26個英文本母和數字,隨著越來越多的國家的語言編碼,unicode不得繼續擴充套件,目前21位已經足夠使用。
utf-32是最好理解的乙個了。utf-32也就是說它的碼元是32位,每32位去讀一下碼點,而碼點是unicode給字元的編碼,前面也說了,最長才21位,因此沒乙個utf-32值都可以直接表示對應的碼點。
小萌:哇,這個好理解,那為啥又有了utf-8,utf-16。
喬哥:因為每個字元占用4位元組太浪費空間了,所以有了utf-8,utf-16。
小萌:那utf-8,utf-18有事咋回事呢?
喬哥:在講utf-8,utf-16之前得講一下編碼空間這個概念。
什麼是編碼空間呢?前面說了unicode,它是21位的。這21位提供了1,114,112個碼點,編碼空間就是對應這1,114,112.個碼點。
對個這個要說一下,這麼多碼點並不代表有這麼多字元,目前大概只有10%的空間被使用了,人類社會還沒創造出1,114,112這麼多的字元。
編碼空間被分成17個平面(plane),每個平面有65536個字元(正好填充2個位元組,16位)。0號平面叫做【基本多文種平面】(bmp,basic multilingual plane),涵蓋了幾乎所有你能遇到的字元,除了emoji(emoji位於1號平面–)。其他平面叫做補充平面,大多是空的。
小萌:編碼空間大體懂了,那和我們要講的utf-8、utf-16到底有啥關係呢?
喬哥:別急別急,馬上就要說到它們的關係了,先說utf-16。
utf-16要常見的多,它的碼元是16位的,也就是說每16位去讀一下碼點,獲取碼點的前16位數字,直到讀取完成。
編碼空間這裡要用上了,bmp(也就是前面說的基本多文種平面)中的每乙個碼點都直接與乙個utf-16的碼點一一對映。
由於bmp幾乎包括了所有常見字元,utf-16一般需要utf-32大約一半的空間。至於其他平面裡很少使用的碼點都是用兩個16位的碼元來編碼的。
小萌:utf-16對於常見字元使用2個字元,不常用的字元使用4個位元組,大大節省了空間!
喬哥:小萌可以啊,但是接下來要說的utf-8比utf-16還厲害呢!
utf-8使用一到四個位元組來編碼乙個碼點。從0到127的這些碼點直接對映成1個位元組(對於只包含這個範圍字元的文字來說,這一點使得utf-8和ascii完全相同)。接下來的1920個碼點對映成2個位元組,在bmp裡所有剩下的碼點需要3個位元組,unicode的其他平面裡的碼點則需要4個位元組。utf-8是基於8位的碼元的。utf-8是基於8位的碼元的,因此它並不需要關心位元組順序(因為位元組就是8位的呀,其他utf-16和utf-32在不同的機器編譯環境下需要考慮位元組的順序問題)
小萌:哇,這個utf-8更靈活呢,「因材施教」!
喬哥:對的,有效率的空間使用,以及不需要操心位元組順序問題使得utf-8成為儲存和交流unicode文字方面的最佳編碼。
小萌:哇,那意思所有的編碼都採用的utf-8?
喬哥:不是的哦,比如jvm中使用的就是utf-16。
字符集 編碼
字符集概念 1 字符集 可以表示的字元和字元對應計算機位元組碼的對映 2 字元編碼方式 計算機中用來表示和傳輸如前所述字符集中對映的位元組碼的編碼方式。對於ascii和gb2312等字符集,他們在傳輸和計算機表示時的位元組碼不用編碼,直接用字元對應的位元組碼表示。但比如unicode 字符集,就有多...
字符集編碼
references 字元編碼中ascii unicode和utf 8的區別 ascii碼 unicode編碼 utf 8編碼的區別 條目ascii unicode utf 8 占用byte數 12,不常用的字元占用4個 變長的編碼方式,將乙個unicode字元編碼成1 6個字元。常用的英文本母被編...
字符集編碼
字符集 字元 只有名字和顯示的樣式。例如 comma 字元碼位 交換碼 每個字元定義乙個唯一的數字表示 碼位 例如 0x2c 字元編碼 內碼 針對一套字元碼位的對映演算法,以在計算機內部用位元組序列表示每個碼位。ascii字符集 主要針對英語使用 每個字元的定義,字元碼位和字元編碼完全相同,最簡單的...