網頁設計gbk編碼與utf-8編碼、Unicode編碼的區別詳解--網站建設知識
UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24為(三個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
GBK是國家標準GB2312基礎上擴容后兼容GB2312的標準。GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBD大。
GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
簡單地說:
對于中文較多的論壇,適宜用GBK編碼節省數據庫空間。對于英文較多的論壇,適宜用UTF-8節省數據庫空間。
GBK簡體中文版和UTF8簡體中文版有什么區別?
ASCII(ISO-8859-1)是鼻祖,最簡單的方式,字節高位為0
GB2312、GBK、GB18030,這幾個是中文編碼方式,并向下兼容。GB2312包含7000多個漢字和字符,GBK包含21000多個,GB18030更厲害,到了27000多個。他們都是用2個字節來表示一個漢字。跟ascii是怎么區分的呢?如果高字節的高位為1(也就是高字節大于127),就表示是漢字,低字節并無明顯特征。
Unicode是統一編碼,它建立了一個全世界統一的碼表。世界上的所有文字,在這張碼表中都是唯一的。
UTF-8是Unicode的一種存儲、傳輸方式。它將整個Unicode碼表分為3部分。
0000 - 007F 這部分是最初的ascii部分,按原始的存儲方式,即0xxxxxxx。
0080 - 07FF 這部分存儲為110xxxxx 10xxxxxx
0800 - FFFF 這部分存儲為1110xxxx 10xxxxxx 10xxxxxx
因此,一個漢字究竟被存儲為什么,就需要:先查unicode碼表,然后根據在碼表的位置進行計算。例如:“電”字,在碼表中是3575,計算成utf8就是E794B5,而在GB2312的碼表中為B5E7
UTF-8的好處:兼容ASCII,存儲英文文件都是單字節,文件小。當然,當以存中文為主時就變成了3字節編碼了,比GB系列還大!如何標明一個文件是utf8格式呢?這個標記是可選的:EF BB BF。比如,用windows自帶的記事本創建一個utf8格式的文件,就會加上這個標記。但是,如果用ultraedit創建utf8文件,并不會加上這個標記。這個標記有個術語,叫做BOM(Byte Order Mark)。不帶BOM的utf8文件和GB2312文件怎么區分呢?我也不知道。唯一能想到的辦法就是:先用一種試,如果出現亂碼,就用另一種再試
UTF-16是雙字節存儲,這就帶來一個問題,即高低字節的順序。兩個字節有兩種順序,它們也用BOM來標明。分為大尾碼和小尾碼兩種。大尾碼的BOM是FEFF,小尾碼的BOM是FFFE
所以我覺得還是GBK好些,如果你是中文站的話
但是還要說一下的是,UTF-8是未來的趨勢。
UNICODE,GBK,UTF-8區別
簡單來說,unicode,gbk和大五碼就是編碼的值,而utf-8,uft-16之類就是這個值的表現形式.而前面那三種編碼是一兼容的,同一個漢字,那三個碼值是完全不一樣的.如"漢"的uncode值與gbk就是不一樣的,假設uncode為a040,gbk為b030,而uft-8碼,就是把那個值表現的形式.utf-8碼完全只針對uncode來組織的,如果GBK要轉UTF-8必須先轉uncode碼,再轉utf-8就OK了.
詳細的就見下面轉的這篇文章.
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
這是一篇程序員寫給程序員的趣味讀物。所謂趣味是指可以比較輕松地了解一些原來不清楚的概念,增進知識,類似于打RPG游戲的升級。整理這篇文章的動機是兩個問題:
問題一:
使用Windows記事本的“另存為”,可以在GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt文件,Windows是怎樣識別編碼方式的呢?
我很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt文件的開頭會多出幾個字節,分別是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基于什么標準呢?
問題二:
最近在網上看到一個ConvertUTF.c,實現了UTF-32、UTF-16和UTF-8這三種編碼方式的相互轉換。對于Unicode(UCS2)、GBK、UTF-8這些編碼方式,我原來就了解。但這個程序讓我有些糊涂,想不起來UTF-16和UCS2有什么關系。
查了查相關資料,總算將這些問題弄清楚了,順帶也了解了一些Unicode的細節。寫成一篇文章,送給有過類似疑問的朋友。本文在寫作時盡量做到通俗易懂,但要求讀者知道什么是字節,什么是十六進制。
0、big endian和little endian
big endian和little endian是CPU處理多字節數的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫到文件里時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。如果將49寫在前面,就是little endian。
“endian”這個詞出自《格列佛游記》。小人國的內戰就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,一個皇帝送了命,另一個丟了王位。
我們一般將endian翻譯成“字節序”,將big endian和little endian稱作“大尾”和“小尾”。
1、字符編碼、內碼,順帶介紹漢字編碼
字符必須編碼后才能被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,為了處理漢字,程序員設計了用于簡體中文的GB2312和用于繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。
從ASCII、GB2312到GBK,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標準支持更多的字符。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高字節的最高位不為0。按照程序員的稱呼,GB2312、GBK都屬于雙字節字符集 (DBCS)。
2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。從漢字字匯上說,GB18030在GB13000.1的20902個漢字的基礎上增加了CJK擴展A的6582個漢字(Unicode碼0x3400-0x4db5),一共收錄了27484個漢字。
CJK就是中日韓的意思。Unicode為了節省碼位,將中日韓三國語言中的文字統一編碼。GB13000.1就是ISO/IEC 10646-1的中文版,相當于Unicode 1.1。
GB18030的編碼采用單字節、雙字節和4字節方案。其中單字節、雙字節和GBK是完全兼容的。4字節編碼的碼位就是收錄了CJK擴展A的6582個漢字。例如:UCS的0x3400在GB18030中的編碼應該是8139EF30,UCS的0x3401在GB18030中的編碼應該是8139EF31。
微軟提供了GB18030的升級包,但這個升級包只是提供了一套支持CJK擴展A的6582個漢字的新字體:新宋體-18030,并不改變內碼。Windows 的內碼仍然是GBK。