<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>網(wǎng)頁編碼</title> </head> <body> </body> </html>
HTML代碼中的<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 指定了網(wǎng)頁的編碼為utf-8。
網(wǎng)頁編碼涉及的知識點比較多,總的說來它也是一個歷史遺留問題。
第一臺計算機(ENIAC)于1946年2月誕生于美國,當(dāng)時美國只考慮自己使用,并在計算機誕生后的幾年里制定了一套ASCII碼標(biāo)準(zhǔn)(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼),它是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。
ASCII碼使用8位二進制數(shù)組合來表示256種可能的字符(2的8次方=256),包含了大小寫字母,數(shù)字0到9,標(biāo)點符號,以及在美式英語中使用的特殊控制字符。一個字符占1個字節(jié)。ASCII碼表部分編碼如下:
HTML的轉(zhuǎn)義符(字符實體),比如符號“<”的轉(zhuǎn)義符為“<”或“<”,其中的數(shù)字編號“60”即是ASCII碼表的第60序號。類似的,大寫字母“K”也可以轉(zhuǎn)義為“K”。
我們使用轉(zhuǎn)義符做個試驗:
美國制定ASCII碼的意思是:ASCII碼可以滿足在計算機領(lǐng)域所有字符和表示上的需要。不過這只是美國自己的意思,畢竟所有的英文單詞都可以拆分來自26個英文字母,ASCII碼表能表達(dá)256個字符,確實足夠美國使用。
后來世界各地也都開始使用計算機,很多國家的語言文字并不是英文,這些國家的文字都沒被包含在ASCII碼表里。以我們中國為例,漢字近10萬個,根本無法排進ASCII碼表。于是我們國家對ASCII碼表進行拓展并形成自己的的一套標(biāo)準(zhǔn),在標(biāo)準(zhǔn)中一個漢字占2個字節(jié),新的碼表可以表達(dá)65536個漢字。但一開始并沒有將碼表全部填充使用完,只收錄了常用的6000多個漢字、英文及其它符號,這套標(biāo)準(zhǔn)稱為GB2312(信息交換用漢字編碼字符集,GB是“國家標(biāo)準(zhǔn)”的簡化詞“國標(biāo)”的拼音首字母縮寫,2312是國標(biāo)序號)。后來又制定了一套收錄更多漢字的標(biāo)準(zhǔn)(收錄的漢字有2萬多個),稱為GBK(漢字編碼擴展規(guī)范,K是“擴”的拼音首字母)。
在GB2312或GBK里,許多標(biāo)點符號都使用2個字節(jié)進行了重新編碼,這類占2個字節(jié)的標(biāo)點符號稱為“全角”字符(“全角”也稱“全形”或“全寬”或“全碼”),原來ASCII碼表中占1個字節(jié)的標(biāo)點符號則稱為“半角”字符(“半角”也稱“半形”或“半寬”或“半碼”)。全角的逗號、括號、句號等與半角是不一樣的:
在中文輸入法下,默認(rèn)的標(biāo)點符號是全角字符;在英文輸入法下,標(biāo)點符號則是半角字符。
我們接著講故事:隨著使用計算機的國家越來越多,各個國家制定自己的計算機編碼標(biāo)準(zhǔn)的情況也越來越多,導(dǎo)致的結(jié)果是:各國計算機的編碼互不支持、認(rèn)識。比如在美國的計算機里要顯示漢字,則必須安裝漢字系統(tǒng)才可以,否則中文文件在美國系統(tǒng)的計算機中打開便是亂碼。
就這樣,在這個時期催生出了一個叫ISO的國際組織(International Organization for Standardization,國際標(biāo)準(zhǔn)化組織),著手解決各國的編碼問題。ISO統(tǒng)一制作了一個稱為UNICODE(統(tǒng)一碼、萬國碼、單一碼,Universal Multiple-Octet Coded Character Set,又簡稱為UCS)的編碼方案,用于收錄地球上所有文字和符號。UNICODE字符分為17組編排,每組編排稱為平面(Plane),每個平面擁有65536個碼位,共計可以收錄1114112個字符(111萬個字符,足夠大的容量)。UNICODE編碼統(tǒng)一一個字符占2個字節(jié)。
但UNICODE在很長一段時間內(nèi)無法推廣,直到互聯(lián)網(wǎng)的出現(xiàn),數(shù)據(jù)的傳輸與交換使各國之間的編碼進行統(tǒng)一化成為迫切的需要。但早期的硬盤和網(wǎng)絡(luò)流量都非常昂貴,UNICODE編碼里的每個字符卻占用了2個字節(jié)的容量,于是為了節(jié)省文件存儲時所占的硬盤空間,也為了節(jié)省字符在網(wǎng)絡(luò)傳輸過程中所占用的網(wǎng)絡(luò)流量,又制定了基于UNICODE、面向傳輸?shù)谋姸鄻?biāo)準(zhǔn),這些面向傳輸?shù)臉?biāo)準(zhǔn)統(tǒng)稱為UTF(UCS Transfer Format)。UNICODE編碼與UTF編碼并不是直接的一一對應(yīng),而是要通過一些算法和規(guī)則來轉(zhuǎn)換。UNICODE與UTF的關(guān)系是:UNICODE是根本、基礎(chǔ)、目的,而UTF只是一種實現(xiàn)UNICODE的手段、方法、過程。
常見的UTF格式有:UTF-8,UTF-16,UTF-32。其中UTF-8是互聯(lián)網(wǎng)上使用最廣的一種UNICODE的實現(xiàn)方式,它專為傳輸而設(shè)計。正因為UTF-8是基于UNICODE而設(shè)計的傳輸實現(xiàn)方式,所以它能使編碼無國界,任意國家的文字都能在任意國家的電腦瀏覽器中里正常顯示。UTF-8最大的一個特點是:它是一種變長的編碼方式,它可以使用1~4個字節(jié)表示一個符號,根據(jù)不同的符號而變化字節(jié)長度,當(dāng)能夠使用1字節(jié)表示一個符號時,便使用1個字節(jié)來表示,如果需要2字節(jié)才能表示的符號,便使用2個字節(jié)來表示,類推,直到4個字節(jié),從而節(jié)省硬盤存儲空間和網(wǎng)絡(luò)流量。
所以我們的網(wǎng)站在開發(fā)時如果使用GB2312或GBK編碼,當(dāng)別的國家的電腦不支持漢字編碼,那么看到的將是亂碼,顯示出來類似這樣:口口口口口。而網(wǎng)站如果使用UTF-8編碼,則任意國家的電腦在打開網(wǎng)站時其內(nèi)容會自動轉(zhuǎn)換成UNICODE編碼,并且由于現(xiàn)在的電腦都支持UNICODE編碼,從而能正常顯示任意文字!
但是國內(nèi)很多的網(wǎng)站仍然使用GB2312或GBK編碼,這類網(wǎng)站通常只面對國內(nèi)用戶提供服務(wù),面對國內(nèi)用戶不會有顯示上的問題。只是如果面對其他國家的瀏覽者,這類網(wǎng)站被打開時很大程度上將呈現(xiàn)亂碼。
為了網(wǎng)站的高兼容性與國際化,推薦網(wǎng)站使用UTF-8編碼,而不是使用GB2312或GBK編碼。
指定網(wǎng)頁為UTF-8、GB2312和GBK的標(biāo)簽分別為:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <meta http-equiv="Content-Type" content="text/html; charset=gbk">
那么有一個問題出現(xiàn)了:網(wǎng)頁各種編碼的區(qū)別,僅僅是在于這一行meta標(biāo)簽的設(shè)置差別嗎?僅僅是“utf-8”這5個字符換成“gb2312”這6個字符之類的這種“小差別”嗎?
不是的,差別不僅僅是這幾個字符的差別。當(dāng)網(wǎng)頁指定meta標(biāo)簽中的編碼為utf-8后,DreamWeaver在保存網(wǎng)頁時會自動將網(wǎng)頁文件保存為utf-8的編碼格式(二進制碼使用utf-8的編碼格式),meta標(biāo)簽中的utf-8編碼是為了告訴瀏覽器:這個網(wǎng)頁用的是utf-8編碼,請在顯示時使用utf-8編碼的格式解析并呈現(xiàn)出來;而如果meta標(biāo)簽中指定編碼為gb2312,DreamWeaver在保存網(wǎng)頁時會自動將網(wǎng)頁文件保存為gb2312的編碼格式(二進制碼使用gb2312的編碼格式),同樣,meta標(biāo)簽中的gb2312編碼只是為了告訴瀏覽器:這個網(wǎng)頁用的是gb2312編碼,請在顯示時使用gb2312編碼的格式解析并呈現(xiàn)出來。我們做個試驗,將一個文本文件分別保存為utf-8格式(打開記事本新建文本文件,輸入內(nèi)容后,選擇菜單:文件→另存為,編碼選擇為UTF-8)和gb2312格式(另存時編碼選擇為ANSI,ANSI代表當(dāng)前操作系統(tǒng)的默認(rèn)編碼,在簡體中文Windows操作系統(tǒng)中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows操作系統(tǒng)中,ANSI編碼代表Big5;在日文Windows操作系統(tǒng)中,ANSI 編碼代表 Shift_JIS 編碼,類推),對比其二進制數(shù)據(jù)。這里使用UltraEdit-32文件編輯器對文本文件進行16進制查看,即使用16進制查看文件的二進制數(shù)據(jù):
從上圖中可以看到,使用utf-8編碼和使用gb2312編碼保存的文件,其二進制數(shù)據(jù)是不一樣的,即這兩個文件的二進制數(shù)據(jù)內(nèi)容是不一樣的。記事本軟件在打開文本文件時,會嘗試識別文件的編碼并進行解析和顯示,即文字保存在記事本里,無論保存成utf-8編碼還是gb2312編碼,通常情況下記事本都能正常識別和顯示,不需要在文件里額外記錄數(shù)據(jù)以告知記事本該文件是什么編碼。但很多軟件卻無法做到智能識別文本文件的編碼,這就要求文本文件在保存時,必須附帶一些特殊的內(nèi)容(額外的數(shù)據(jù))以告知該文件是什么編碼。UNICODE規(guī)范中有一個BOM(Byte Order Mark)的概念,就是字節(jié)序標(biāo)記,在文件頭部開始位置寫入三個字節(jié)(EF BB BF)以告知該文件是utf-8編碼格式。但這個BOM又帶出了新的問題:不是所有的軟件或處理程序都支持BOM,即不是所有的軟件或處理程序都能識別文件開頭的(EF BB BF)這三個字節(jié)。當(dāng)不支持識別時,這三個字節(jié)又會被當(dāng)成文件的實際數(shù)據(jù)內(nèi)容。早期的火狐不支持對BOM的識別,當(dāng)遇到BOM時會對這三個字節(jié)顯示出特殊的亂碼符號;而到目前為止,PHP處理程序仍然不支持BOM,即當(dāng)一個PHP文件保存為utf-8時,如果附帶了BOM,那么PHP處理程序會將BOM解析為PHP文件的實際數(shù)據(jù)內(nèi)容而導(dǎo)致出錯!在DreamWeaver中,選擇軟件頭部菜單:修改→頁面屬性(也可以直接按快捷鍵ctrl+j),在彈出的頁面屬性面板中點選“標(biāo)題/編碼”,即可看到可供選擇的編碼。通常在改變網(wǎng)頁的編碼時,使用這種方式改變。如下圖:
所以:當(dāng)我們在meta標(biāo)簽中設(shè)置為utf-8編碼格式時,網(wǎng)頁文件就必須要存儲為utf-8格式,這樣瀏覽器才能正常顯示網(wǎng)頁而不是顯示亂碼。如果在meta標(biāo)簽中設(shè)置utf-8編碼格式,網(wǎng)頁文件卻保存為gbk或其它格式,那么在打開網(wǎng)頁時瀏覽器會接到網(wǎng)頁meta標(biāo)簽中格式的通知:使用utf-8編碼格式來解析和顯示網(wǎng)頁,而網(wǎng)頁的二進制碼(數(shù)據(jù)內(nèi)容)卻為gbk編碼或其它格式,顯示出來就會是亂碼!這好比相親時,紅娘手里的資料有誤,錯誤的告知男方:女方講英語(meta標(biāo)簽中設(shè)置為utf-8編碼)。結(jié)果女方卻不懂英語(文件卻不是utf-8編碼)。男方開口一句“Hello”就讓女方不知所謂了(亂碼)。
我們來實驗一下,網(wǎng)頁指定meta標(biāo)簽中的編碼為utf-8,文件卻保存為gbk格式:我們先用DreamWeaver編輯一個utf-8格式的網(wǎng)頁并保存,然后再用記事本打開該網(wǎng)頁,另存為,編碼選擇為ANSI。
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>中文</title> </head> <body> 本文件使用dreamweaver保存后,再使用記事本打開,并另存為ANSI編碼。 </body> </html>
在瀏覽器中的執(zhí)行結(jié)果如下:
綜上所述:網(wǎng)頁開發(fā)時,盡量使用utf-8編碼格式,并且在保存文件時,保存為utf-8編碼。(dreamweaver在保存網(wǎng)頁文件時,會根據(jù)<meta http-equiv="Content-Type" content="text/html; charset=編碼">所指定的編碼自動保存為正確的對應(yīng)編碼,但如果使用其它網(wǎng)站代碼編輯器,比如記事本、Editplus等,就需要注意,在保存文件時要選擇為正確的編碼)。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com