說說字元編碼吧! ( ͡° ͜ʖ ͡°) 怎麼打出來的

LUFOR129
6 min readOct 14, 2018

最近沉迷鬥陣無法自拔,已經好久沒有寫文章了,想當初還信誓旦旦的說一個禮拜要寫兩篇 #゚Å゚)⊂彡☆))゚Д゚) 。 說到字元的編碼,我們先來釐清專有名詞吧。

(手機看可能會跑版)英文    bit    byte   char   String台灣    位元   位元組   字元    字串大陸    比特    字節    字符    字符串簡單解釋的話:
bit 就是計算機的最小單位,看到的1/0就是bit。
byte是計算機儲存的最小單位, 1byte = 8bit ; 看到的kb、mb的b 是 byte
補充一些基本資料類型:int 4byte/32bit -2^31~2^31*-1 (因為2’s complement)
float 4byte/32bit
char 1~4byte(本文重點)

一、 ASCII

退回至1960年代電腦剛被發明不久後遇到了一個問題,我們該如何儲存資料呢? 不過幸好是美國人發明電腦,又或者說幸好美國人用英文。英文不過26個字母使用少少的空間就能儲存啦! 因此最早的儲存編碼ASC 是使用1byte儲存資料。

ASC Table 我永遠記不起來 A 和 a 從哪開始

此時電腦傳到歐洲,歐洲人當然抗議啦! 全世界又不是都寫英文,這根本是英文沙文主義阿!!(其實英國人也遇到問題,打不出英鎊符號 £)。因此之後又一次的擴充加入了一些歐洲文字形成現在的ASCII。

二、各國自己造文字

但電腦也不是只有歐洲人美國人在用啊!! 我們其他國家也要求有使用電腦的權利。尤其是像我們使用中文字,中文字這博大精深阿~~少說3、5千應該跑不掉,這可苦惱了台灣與大陸。

中文編碼知名的就是台灣的BIG5與大陸的GBK,兩者同樣的是使用類似ASCII一段01001010對應一個文字,兩者都是使用2 byte作為編碼,並且為16進位制。舉個例子 :

中文的 '中'BIG5  A4A4GBK   D6D0

其他國家也是用同樣的方法解決的自己的編碼問題,大家從此過上幸福快樂的生活了嗎??

注意上面的 '中' 字,秉持國共不兩立的原則,我們與大陸之間的編碼萬萬不可相同,不然國軍機密將會外洩。所以常常大陸檔案在台灣開啟時會出現"緲巂鐸韢",而大陸開啟台灣檔案時會出現" 烫屯锟斤拷"。不只台灣與大陸各國之間都出現了編碼轉換問題。

三、 編碼的大統一 Unicode

和物理學一樣,計算機界也在追求大統一。其實這也歸功於儲存設備大大的進步。一個叫ISO的組織(國際標準組織)發展了unicode,他們將世上所有的文字收入其中並且規定,不論你是英文、中文、俄文,單個char就是2byte。使用Unicode後全世界的編碼都不會有問題的!!

2byte = 2¹⁶ 有 65536個碼位照理來說十分夠用,但開始有人還想把古希臘文、古埃及文、瑪雅文、魔戒的文字都收錄進去,因此之後出現了用4byte的Unicode: UCS-4 可以收錄 2147483648個碼位 。

看到這想必覺得真是太棒了,使用了UCS-4,以後我跟外星人Line都不會出現亂碼了,實在是太方便了!! 然額,Unicode剛推出時出現巨大的阻礙。

四、 UTF的發明

Unicode剛出現時有兩個弊端讓原本使用ASCII的人很不爽。

  1. UniCode用2個byte而ASCII用1個byte,如何讓電腦知道這是一個char而不是兩個ASCII
  2. 原本只使用ASCII一個byte即可滿足需求,但使用Unicode後強制轉為兩個byte造成空間的浪費。
舉例來說:英文            A
ASCII 0100 0001
Unicode 0000 0000 0100 0001
前面一堆0根本沒意義阿,可能還會被電腦誤認為其他字
因此UTF出現了( Unicode/UCS Transformation Format),下邊介紹UTF-8

UTF是一種轉碼工具,可將Unicode轉為UTF-8。UTF-8最大的特點就是可長可短,UTF-8可為1~4個byte組成,如何運作的呢?

  1. 建立判斷頭,以每8個bit為分割,要是電腦讀開頭為0,代表這是英文or數字,和ASCII相同。
  2. 其他n個byte的字,利用判斷頭有多少個1即可知道是2~4個byte。

舉下面例子:

舉個例子:

英文字         A
二進位 0100 0001
UniCode 0000 0000 0100 0001
UTF8 0100 0001
電腦看到後開頭為 0 因此直接輸出1個字節中文字 魚
Unicode(16) 2FC2
Unicode(2) 0010 1111 1100 0010
UTF8轉碼 1110xxxx 10xxxxxx 10xxxxxx (填入x)
轉碼後 11100010 10111111 10000010
UTF8(16) E2 BF 82 (三個byte)

UTF8編碼其實就是標準的霍夫曼編碼的經典例子。到這邊為止終於完成了char編碼的大統一,歐美人開心的使用只有1byte的字,而我們也不會有亂碼的問題出現。可能有人會問,如果這個這麼方便位什麼像是BIG5、GBK依舊活的好好的?

其實是因為儲存空間啦~ UTF8的中文字大多3~4byte,使用BIG5只有2Byte,因此還是會有很多人使用自己國家的編碼。

回到主題,Unicode除了各國字外也收入了許多符號。要說Unicode對人類最大的貢獻 那就是能夠使用顏文字啦! (๑•̀ㅂ•́)و✧

題外話: 有外國人以為中文的鍵盤長這樣

--

--

LUFOR129
LUFOR129

Responses (1)