UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節(jié)編碼,它對英文使用8位(即一個字節(jié)),中文使用24為(三個字節(jié))來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
GBK是國家標(biāo)準(zhǔn)GB2312基礎(chǔ)上擴(kuò)容后兼容GB2312的標(biāo)準(zhǔn)。GBK的文字編碼是用雙字節(jié)來表示的,即不論中、英文字符均使用雙字節(jié)來表示,為了區(qū)分中文,將其最高位都設(shè)定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數(shù)據(jù)庫比GBD大。
GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉(zhuǎn)換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
對于一個網(wǎng)站、論壇來說,如果英文字符較多,則建議使用UTF-8節(jié)省空間。不過現(xiàn)在很多論壇的插件一般只支持GBK。
個編碼的區(qū)別詳細(xì)解釋
簡單來說,unicode,gbk和大五碼就是編碼的值,而utf-8,uft-16之類就是這個值的表現(xiàn)形式.而前面那三種編碼是一兼容的,同一個漢字,那三個碼值是完全不一樣的.如"漢"的uncode值與gbk就是不一樣的,假設(shè)uncode為a040,gbk為b030,而uft-8碼,就是把那個值表現(xiàn)的形式.utf-8碼完全只針對uncode來組織的,如果GBK要轉(zhuǎn)UTF-8必須先轉(zhuǎn)uncode碼,再轉(zhuǎn)utf-8就OK了.
詳細(xì)的就見下面轉(zhuǎn)的這篇文章.
談?wù)刄nicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
這是一篇程序員寫給程序員的趣味讀物。所謂趣味是指可以比較輕松地了解一些原來不清楚的概念,增進(jìn)知識,類似于打RPG游戲的升級。整理這篇文章的動機(jī)是兩個問題:
問題一:
使用Windows記事本的“另存為”,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉(zhuǎn)換。同樣是txt文件,Windows是怎樣識別編碼方式的呢?
我很早前就發(fā)現(xiàn)Unicode、Unicode bigendian和UTF-8編碼的txt文件的開頭會多出幾個字節(jié),分別是FF、FE(Unicode),FE、FF(Unicode bigendian),EF、BB、BF(UTF-8)。但這些標(biāo)記是基于什么標(biāo)準(zhǔn)呢?
問題二:
最近在網(wǎng)上看到一個ConvertUTF.c,實現(xiàn)了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉(zhuǎn)換。對于Unicode(UCS2)、GBK、UTF-8這些編碼方式,我原來就了解。但這個程序讓我有些糊涂,想不起來UTF-16和UCS2有什么關(guān)系。
查了查相關(guān)資料,總算將這些問題弄清楚了,順帶也了解了一些Unicode的細(xì)節(jié)。寫成一篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知道什么是字節(jié),什么是十六進(jìn)制。
0、big endian和little endian
big endian和littleendian是CPU處理多字節(jié)數(shù)的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫到文件里時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。如果將49寫在前面,就是little endian。
“endian”這個詞出自《格列佛游記》。小人國的內(nèi)戰(zhàn)就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發(fā)生過六次叛亂,一個皇帝送了命,另一個丟了王位。
我們一般將endian翻譯成“字節(jié)序”,將big endian和little endian稱作“大尾”和“小尾”。
1、字符編碼、內(nèi)碼,順帶介紹漢字編碼
字符必須編碼后才能被計算機(jī)處理。計算機(jī)使用的缺省編碼方式就是計算機(jī)的內(nèi)碼。早期的計算機(jī)使用7位的ASCII編碼,為了處理漢字,程序員設(shè)計了用于簡體中文的GB2312和用于繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區(qū)的內(nèi)碼范圍高字節(jié)從B0-F7,低字節(jié)從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312支持的漢字太少。1995年的漢字?jǐn)U展規(guī)范GBK1.0收錄了21886個符號,它分為漢字區(qū)和圖形符號區(qū)。漢字區(qū)包括21003個字符。
從ASCII、GB2312到GBK,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標(biāo)準(zhǔn)支持更多的字符。在這些編碼中,英文和中文可以統(tǒng)一地處理。區(qū)分中文編碼的方法是高字節(jié)的最高位不為0。按照程序員的稱呼,GB2312、GBK都屬于雙字節(jié)字符集 (DBCS)。
2000年的GB18030是取代GBK1.0的正式國家標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數(shù)民族文字。從漢字字匯上說,GB18030在GB13000.1的20902個漢字的基礎(chǔ)上增加了CJK擴(kuò)展A的6582個漢字(Unicode碼0x3400-0x4db5),一共收錄了27484個漢字。
CJK就是中日韓的意思。Unicode為了節(jié)省碼位,將中日韓三國語言中的文字統(tǒng)一編碼。GB13000.1就是ISO/IEC 10646-1的中文版,相當(dāng)于Unicode 1.1。
GB18030的編碼采用單字節(jié)、雙字節(jié)和4字節(jié)方案。其中單字節(jié)、雙字節(jié)和GBK是完全兼容的。4字節(jié)編碼的碼位就是收錄了CJK擴(kuò)展A的6582個漢字。例如:UCS的0x3400在GB18030中的編碼應(yīng)該是8139EF30,UCS的0x3401在GB18030中的編碼應(yīng)該是8139EF31。
微軟提供了GB18030的升級包,但這個升級包只是提供了一套支持CJK擴(kuò)展A的6582個漢字的新字體:新宋體-18030,并不改變內(nèi)碼。Windows 的內(nèi)碼仍然是GBK。
這里還有一些細(xì)節(jié):
GB2312的原文還是區(qū)位碼,從區(qū)位碼到內(nèi)碼,需要在高字節(jié)和低字節(jié)上分別加上A0。
對于任何字符編碼,編碼單元的順序是由編碼方案指定的,與endian無關(guān)。例如GBK的編碼單元是字節(jié),用兩個字節(jié)表示一個漢字。這兩個字節(jié)的順序是固定的,不受CPU字節(jié)序的影響。UTF-16的編碼單元是word(雙字節(jié)),word之間的順序是編碼方案指定的,word內(nèi)部的字節(jié)排列才會受到endian的影響。后面還會介紹UTF-16。
GB2312的兩個字節(jié)的最高位都是1。但符合這個條件的碼位只有128*128=16384個。所以GBK和GB18030的低字節(jié)最高位都可能不是1。不過這不影響DBCS字符流的解析:在讀取DBCS字符流時,只要遇到高位為1的字節(jié),就可以將下兩個字節(jié)作為一個雙字節(jié)編碼,而不用管低字節(jié)的高位是什么。