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