1. 程式人生 > >計算機字元編碼: ASCII, Unicode, utf-8 ,GBK

計算機字元編碼: ASCII, Unicode, utf-8 ,GBK

前言: 最近專案中遇到了utf-8 和 gbk 轉換的問題,突然對計算機中字串的編碼問題產生了興趣,拜讀了幾篇文章,做了一下簡單的總結

一 ASCII

我們知道,計算機的內部只認 二進位制 0,1的狀態,通常8個二進位制代表一個位元組,這是計算機最小的儲存單位,一個位元組可以有 2^8 = 256 個狀態。 最開始,美國製定了一套具有128個狀態的字元編碼,這被稱為ASCII碼, 這128個字元還包括了大小寫和一些鍵盤的控制符號,比如 空格 ASCII碼為32 (00100000),這套ASCII 碼基本適用了以英文為基礎的國家計算機編碼

二 其他國家的編碼方式

有了ASCII 碼,以英文為主要語言的國家在使用計算機上已經沒有問題,但是世界各地其他使用其他語言的國家確遇到了難題,他們的語言在ASCII 上沒有,因此,為了讓計算機儲存他們的文字,他們決定有 ASCII 碼剩餘空閒的一位作為他們語言的編碼體系,(ASCII 碼 為128個,而一個位元組為8位,即最多可以容納 256個字元,因此最高位在ASCII 碼中統一規定為 0,其他國家利用的就是這一閒置的最高位) 然後,每個國家都用 最高位來作為自己的編碼體系,所以出現了不同國家之間編碼一樣,但是代表的符號不一樣,無法統一,從而造成不同語言打開出現亂碼現象。

三 中國(GBK 系列)

由於中文漢字個數太多,僅僅用一個位元組的長度已經無法容納各種各自的漢字了,因此,中國採用兩個位元組來編碼,無論中英文都是兩個字元,這就是GBK 編碼 (詳細: 小於127號的還是繼續使用,並且用2個大於127的位元組表示一箇中文字元,前面的一個位元組(他稱之為高位元組)從0xA1用到 0xF7,後面一個位元組(低位元組)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼裡,我們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 裡本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是常說的 全形 字元,而原來在127號以下的那些就叫 半形 字元了。 中國人民看到這樣很不錯,於是就把這種漢字方案叫做 “GB2312“。GB2312 是對 ASCII 的中文擴充套件。)

四 集大成者(Unicode)

既然語言如此多樣,而各種編碼規則又是亂成一鍋,因此為了實現統一,國際標誰化組織廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼,這個編碼成為unicode unicode 編碼規定保留之前的ASCII 的字元,並把所有的字元都用兩個位元組 去表示,這一規定雖然統一了編碼的規範,但是出現的嚴重問題是大量的浪費儲存的空間,計算機程式設計大部分都是英文字元,而英文字元使用一個位元組就足夠表示了,unicode 編碼規定所有的字元都表示成 兩個位元組,即英文字元會在另一個位元組中補0,大大浪費了空間。

五 最終方案(utf-8)

utf-8 的編碼規則規定,像英文這樣的簡單字元用單位元組表示,而像中文這樣複雜的字元用三個位元組表示。

UTF-8 的編碼規則很簡單,只有二條:

1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的 Unicode 碼。因此對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。

2)對於n位元組的符號(n > 1),第一個位元組的前n位都設為1,第n + 1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的 Unicode 碼。

六 GBK 和 utf-8 的選擇

既然utf-8 的中文由三個字元表示,那麼當你的網頁應用面向的是中文群體,或者你的語言選擇就是中文字元,可以使用GBK 編碼節省資源,當你的應用需要面向國際時,最佳選擇還是utf-8 ,GBK 在其他語言的系統需要下載gbk的包,不然會產生亂碼。