2238浏覽量

UTF-8 GBK UTF8 GB2312之間的區别和關系

來源: 時間:2012-12-18

UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一(yī)種多字節編碼,它對英文使用8位(即一(yī)個字節),中(zhōng)文使用24爲(三個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的浏覽器上顯示。如,如果是UTF8編碼,則在外(wài)國人的英文IE上也能顯示中(zhōng)文,他們無需下(xià)載IE的中(zhōng)文語言支持包。

GBK是國家标準GB2312基礎上擴容後兼容GB2312的标準。GBK的文字編碼是用雙字節來表示的,即不論中(zhōng)、英文字符均使用雙字節來表示,爲了區分(fēn)中(zhōng)文,将其最高位都設定成1。GBK包含全部中(zhōng)文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBD大(dà)。

GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

對于一(yī)個網站、論壇來說,如果英文字符較多,則建議使用UTF-8節省空間。不過現在很多論壇的插件一(yī)般隻支持GBK。
個編碼的區别詳細解釋
簡單來說,unicode,gbk和大(dà)五碼就是編碼的值,而utf-8,uft-16之類就是這個值的表現形式.而前面那三種編碼是一(yī)兼容的,同一(yī)個漢字,那三個碼值是完全不一(yī)樣的.如"漢"的uncode值與gbk就是不一(yī)樣的,假設uncode爲a040,gbk爲b030,而uft-8碼,就是把那個值表現的形式.utf-8碼完全隻針對uncode來組織的,如果GBK要轉UTF-8必須先轉uncode碼,再轉utf-8就OK了.

詳細的就見下(xià)面轉的這篇文章.

談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
這是一(yī)篇程序員(yuán)寫給程序員(yuán)的趣味讀物(wù)。所謂趣味是指可以比較輕松地了解一(yī)些原來不清楚的概念,增進知(zhī)識,類似于打RPG遊戲的升級。整理這篇文章的動機是兩個問題:

問題一(yī):
使用Windows記事本的“另存爲”,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt文件,Windows是怎樣識别編碼方式的呢?

我(wǒ)很早前就發現Unicode、Unicode bigendian和UTF-8編碼的txt文件的開(kāi)頭會多出幾個字節,分(fēn)别是FF、FE(Unicode),FE、FF(Unicode bigendian),EF、BB、BF(UTF-8)。但這些标記是基于什麽标準呢?

問題二:
最近在網上看到一(yī)個ConvertUTF.c,實現了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉換。對于Unicode(UCS2)、GBK、UTF-8這些編碼方式,我(wǒ)原來就了解。但這個程序讓我(wǒ)有些糊塗,想不起來UTF-16和UCS2有什麽關系。
查了查相關資(zī)料,總算将這些問題弄清楚了,順帶也了解了一(yī)些Unicode的細節。寫成一(yī)篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知(zhī)道什麽是字節,什麽是十六進制。

0、big endian和little endian
big endian和littleendian是CPU處理多字節數的不同方式。例如“漢”字的Unicode編碼是6C49。那麽寫到文件裏時,究竟是将6C寫在前面,還是将49寫在前面?如果将6C寫在前面,就是big endian。如果将49寫在前面,就是little endian。

“endian”這個詞出自《格列佛遊記》。小(xiǎo)人國的内戰就源于吃雞蛋時是究竟從大(dà)頭(Big-Endian)敲開(kāi)還是從小(xiǎo)頭(Little-Endian)敲開(kāi),由此曾發生(shēng)過六次叛亂,一(yī)個皇帝送了命,另一(yī)個丢了王位。

我(wǒ)們一(yī)般将endian翻譯成“字節序”,将big endian和little endian稱作“大(dà)尾”和“小(xiǎo)尾”。

1、字符編碼、内碼,順帶介紹漢字編碼
字符必須編碼後才能被計算機處理。計算機使用的缺省編碼方式就是計算機的内碼。早期的計算機使用7位的ASCII編碼,爲了處理漢字,程序員(yuán)設計了用于簡體(tǐ)中(zhōng)文的GB2312和用于繁體(tǐ)中(zhōng)文的big5。

GB2312(1980年)一(yī)共收錄了7445個字符,包括6763個漢字和682個其它符号。漢字區的内碼範圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中(zhōng)有5個空位是D7FA-D7FE。

GB2312支持的漢字太少。1995年的漢字擴展規範GBK1.0收錄了21886個符号,它分(fēn)爲漢字區和圖形符号區。漢字區包括21003個字符。

從ASCII、GB2312到GBK,這些編碼方法是向下(xià)兼容的,即同一(yī)個字符在這些方案中(zhōng)總是有相同的編碼,後面的标準支持更多的字符。在這些編碼中(zhōng),英文和中(zhōng)文可以統一(yī)地處理。區分(fēn)中(zhōng)文編碼的方法是高字節的最高位不爲0。按照程序員(yuán)的稱呼,GB2312、GBK都屬于雙字節字符集 (DBCS)。

2000年的GB18030是取代GBK1.0的正式國家标準。該标準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。從漢字字彙上說,GB18030在GB13000.1的20902個漢字的基礎上增加了CJK擴展A的6582個漢字(Unicode碼0x3400-0x4db5),一(yī)共收錄了27484個漢字。

CJK就是中(zhōng)日韓的意思。Unicode爲了節省碼位,将中(zhōng)日韓三國語言中(zhōng)的文字統一(yī)編碼。GB13000.1就是ISO/IEC 10646-1的中(zhōng)文版,相當于Unicode 1.1。

GB18030的編碼采用單字節、雙字節和4字節方案。其中(zhōng)單字節、雙字節和GBK是完全兼容的。4字節編碼的碼位就是收錄了CJK擴展A的6582個漢字。例如:UCS的0x3400在GB18030中(zhōng)的編碼應該是8139EF30,UCS的0x3401在GB18030中(zhōng)的編碼應該是8139EF31。

微軟提供了GB18030的升級包,但這個升級包隻是提供了一(yī)套支持CJK擴展A的6582個漢字的新字體(tǐ):新宋體(tǐ)-18030,并不改變内碼。Windows 的内碼仍然是GBK。

這裏還有一(yī)些細節:

GB2312的原文還是區位碼,從區位碼到内碼,需要在高字節和低字節上分(fēn)别加上A0。

對于任何字符編碼,編碼單元的順序是由編碼方案指定的,與endian無關。例如GBK的編碼單元是字節,用兩個字節表示一(yī)個漢字。這兩個字節的順序是固定的,不受CPU字節序的影響。UTF-16的編碼單元是word(雙字節),word之間的順序是編碼方案指定的,word内部的字節排列才會受到endian的影響。後面還會介紹UTF-16。

GB2312的兩個字節的最高位都是1。但符合這個條件的碼位隻有128*128=16384個。所以GBK和GB18030的低字節最高位都可能不是1。不過這不影響DBCS字符流的解析:在讀取DBCS字符流時,隻要遇到高位爲1的字節,就可以将下(xià)兩個字節作爲一(yī)個雙字節編碼,而不用管低字節的高位是什麽。

下(xià)一(yī)篇 絕對路徑和相對路徑

上一(yī)篇: htm、html、shtml區别

聯系我(wǒ)們

一(yī)次需求提交或許正是成就一(yī)個出色産品的開(kāi)始。
歡迎填寫表格或發送合作郵件至: qczsky@126.com

大(dà)理青橙科技

電(diàn)話(huà):13988578755 13988578755

郵箱:qczsky@126.com

地址:大(dà)理市下(xià)關龍都春天10層