Unicode字符集與utf-8編碼

我們都知道計算存儲數據和傳輸數據都是以二進制的形式,也就是0和1,這是因爲0和1剛好對應電路中的高電位和低電位。

計算機中最小的存儲單位爲字節(byte),最小傳輸單位是位(bit),一個字節佔8位。

既然計算機存儲的是二進制數,那麼在顯示終端上是怎麼展示成人類識別的文字或者符號的呢?

我們知道計算機最開始是在美國使用,他們爲了解決這個問題,於是想了一個辦法,將每一個符號(文字)與一個數值對應,比如英文字母"a",對應數字97,以二進制表示爲01100001。而8位共有2的8次方256中排列組合,而英文字母一共只有26個,加上大小寫52個,再加上阿拉伯數字0到10和一些符號,一共排到了127,一個字節剛好夠存儲。於是美國人就把這個二進制與字符的映射關係叫做ANSI,也就是Ascii(美國標準信息互換碼)。

後來計算機傳到了其他國家,但他們的一些字符ANSI裏面沒有,於是,他們將自己國家的字符往127後繼續排,直到255,他們把128-255這段稱爲擴展字符集。但是255是遠遠不夠的,尤其是當計算機傳到中國,光是常用漢字就有3000多個。

於是聰明的中國人把那些127號之後的奇異符號們直接取消掉, 規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱之爲高字節)從0xA1用到0xF7,後面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼裏,我們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 裏本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的”全角”字符,而原來在127號以下的那些就叫”半角”字符了。中國人民看到這樣很不錯,於是就把這種漢字方案叫做 “GB2312“。GB2312 是對 ASCII 的中文擴展。

不僅是中國,其他國家也搞一套自己的字符集,結果誰也不懂誰的編碼。

就在這個時候,一個叫做ISO(國際標準化組織)的組織出現了,它說這樣不行,得由他來定義一套統一得標準,於是,他廢除了其他地區的編碼方法,重新搞了一套包含地球上所有文字,和符號的編碼,也就是unicode編碼,俗稱萬國碼。

ISO規定,所有的字符必須用兩個字節表示,也就是16位,對於Ascii字符集裏的也用兩個字節表示,高位用0補齊。

這樣有一個很大的問題,就是當字符對應的碼點數小於255時,因爲高8位永遠爲0,這樣我們就極大地浪費了存儲空間,但是如果我們把這個爲0的8位去掉,計算機怎麼認識,那個字符佔8位,那個佔16位呢,舉個例子

字符串"a我"用如果以unicdeo標準來表示則爲"00000000 01100001 01100010 00010001"(爲了便於閱讀我每8爲加了一個空格)

這樣計算機讀取的時候,可以每次固定取16位,然後根據字符集對應的碼點找到對應的字符。

但是如果我們爲了節省空間,把第一個8位爲0去掉,則爲"01100001 01100010 00010001",這樣在存儲的時候是沒有問題的,我們根據對應的字符,找到其碼點數,如果高8位是0就去掉。

但是當我們需要從計算機存儲空間了讀出來(比如顯示在屏幕上),計算機就不知道那個字符是兩個字節,那個是一個字節了。

因爲每個字符現在所佔字節數不是固定的了。

知道UTF-8(UCS Transfer Format)出現,

UTF-8就是在互聯網上使用最廣的一種unicode的實現方式,這是爲傳輸而設計的編碼,並使編碼無國界,這樣就可以顯示全世界上所有文化的字符了。UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做爲它的一部分,注意的是unicode一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節)。從unicode到utf-8並不是直接的對應,而是要過一些算法和規則來轉換。

UTF8的編碼方式:

根據上表的規範,0-127碼點數對應的字符,我們用一個字節表示,其第一位爲0;

如果第一位是1,則看連續幾個1,如果是2個則表示兩個字節存儲,三個就是三個字節存儲,首個字節連續1後面是個0,後面的字節前兩位都用10填充。這些位置確定好後,再找到對應字符的碼點數,從右往左對應往裏填充,不足的用0補充。

以"我"爲例"01100010 00010001" =>25105,從上表中看,需要三個字節存儲

首先是1110xxxx 10xxxxxx 10xxxxxx

然後我們將01100010 00010001從右到左往x裏填 => 11100110 10001000 10010001

結果就是如上。這就是UTF-8的編碼思想。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章