utf-8 unicode 各種編碼的區別與聯絡
1.編碼的大概認識
以UTF8格式儲存的檔案檔首標識為EF BB BF。
效率從上述編碼原理中得出的結論是:
1).每個英文字母、數字所佔的空間為1 Byte;
2).泛歐語系、斯拉夫語字母佔2 Bytes;
3).漢字佔3 Bytes。
由此可見UTF8對英文來說是個非常誘人的方案,但對中文來說則不太合算,無論用ANSI還是 Unicode/UCS2來編碼都只用2 Bytes,但用UTF8則需要3 Bytes。
以下是一些統計資料,顯示用UTF8來儲存檔案每個字元所需的平均位元組:
1).拉丁語系平均用1.1 Bytes;
2).希臘文、俄文、阿拉伯文和希伯萊文平均用1.7 Bytes;
3).其他大部份文字如中文、日文、韓文、Hindi(北印度語
4).用超過4 Bytes的都是些非常少用的文字元號。
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字元編碼。它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。
按照utf-8創始人的願望:
端(unicode)——傳輸(utf-8)——端(unicode)
但是,後來,許多網站開發者在開發網頁時直接使用utf-8編碼。
端(utf-8)——傳輸(utf-8)——端(utf-8)
PS:國際文件(txt和xml)使用unicode編碼是正宗做法;作業系統和瀏覽器都能夠“理解”unicode編碼。瀏覽器“迫於壓力”才“理解”utf-8編碼。但是,作業系統有時只認unicode編碼。
2. 編碼基本知識
最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。
2.1. iso8859-1 通常叫做Latin-1
屬於單位元組編碼,最多能表示的字元範圍是0-255,應用於英文系列。比如,字母a的編碼為0x61=97。
很明顯,iso8859-1編碼表示的字元範圍很窄,無法表示中文字元。但是,由於是單位元組編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協議上,預設使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字元,使用iso8859-1編碼的時候則將它拆開為4個位元組來表示:"d6 d0 ce c4"(事實上,在進行儲存的時候,也是以位元組為單位處理的)。而如果是UTF編碼,則是6個位元組"e4 b8 ad
e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。
2.2. GB2312/GBK
這就是漢子的國標碼,專門用來表示漢字,是雙位元組編碼,而英文字母和iso8859-1一致(相容iso8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是相容gb2312編碼的。
2.3. unicode
這是最統一的編碼,可以用來表示所有語言的字元,而且是定長雙位元組(也有四位元組的)編碼,包括英文字母在內。所以可以說它是不相容iso8859-1編碼的,也不相容任何編碼。不過,相對於iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0位元組,比如字母a為"00 61"。
需要說明的是,定長編碼便於計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字元,所以在很多軟體內部是使用unicode編碼來處理的,比如java。
2.4. UTF
考慮到unicode編碼不相容iso8859-1編碼,而且容易佔用更多的空間:因為對於英文字母,unicode也需要兩個位元組來表示。所以unicode不便於傳輸和儲存。因此而產生了utf編碼,utf編碼相容iso8859-1編碼,同時也可以用來表示所有語言的字元,不過,utf編碼是不定長編碼,每一個字元的長度從1-6個位元組不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個位元組表示,而漢字使用三個位元組。
注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個位元組,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字元。