http://www.chweng.idv.tw/w3cguide/htmladvanced/declarations.php
文件類型聲明(Document Type Declarations)
在你每一個頁面的頂端,你需要文件聲明。是的,必須。
如果不指定文件類型,你的HTML不是合法的HTML,並且大部分瀏覽器會用“怪癖模式(quirks mode)”來處理頁面,這意味著瀏覽器認為你自己也不知道究竟在做什麼,並且按瀏覽器自己的方式來處理你的原始碼。你可以是一個HTML大師,在地球上打遍天下無敵手,或者你的HTML可以無瑕疵,CSS可以很完美,但如果沒有文件聲明,或者錯誤的文件聲明,你的網頁與一個短視的,獨眼的長臂猿嬰兒十分艱難地堆砌起來的沒兩樣。
XHTML 1.0 Strict(嚴格)的文件聲明是這樣的:
下面的是XHTML 1.1的文件聲明,作為XHTML的最新版本,看起來更完美,但還是有一些問題,隨後我們會稍微講解……
"-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
如果你不願放棄HTML 4或者你還有Netscape 4死忠用戶,你可以使用XHTML 1.0 Transitional(過渡):
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
你使用這的唯一理由是你還要相容老版本的、少用的瀏覽器。過渡XHTML 1.0允許HTML 4的表現元素,其也可能在如Netscape 4的瀏覽器中表現更好。但使用這些元素將對你網頁的效率和可用性有害。
最後,如果你是使用框架的怪人之一,可以使用像下面一樣的XHTML 1.0 Frameset(框架)文件類型聲明:
"-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
注意DOCTYPE標籤必須大寫和前置一個英文半型驚嘆號!。它是唯一一個打破規則的標籤,它不需要關閉。
語言聲明(Language Declarations)
即使HTTP頭或者在html起始標籤內設置了xml:lang屬性,你也必須為文件指定一個主要語言。儘管處理一個合法的XHTML文件這不是必須的,但也是一個易用性的考慮。值是縮寫的,比如en(English,英語)、fr(French,法語)、de(German,德語)或者mg(Malagasy,這是什麼語?譯者也不知道,呵呵。——譯者注)。
聲明一個主要用英語內容的文件,例子是這樣的:
xml:lang="en">
在聲明主要語言之後,假如還需要使用其他語言,你還可以在內聯中使用xml:lang屬性(比如HTML Hund)。
內容類型(Content Types)
HTML文件的媒體類型和字體集也許要指定,可以使用HTTP header來完成,比如:
Content-Type: text/html; charset=UTF-8
HTTP header的第一部分(如text/html)是文件MIME類型,讓瀏覽器知道文件的媒體類型因此可以知道怎麼處理。所有的文件都有MIME類型。JPEG圖片是image/jpeg,CSS文件是text/css和HTML一般使用text/html。
HTTP header的第二部分(如UTF-8部分)是字元集。
也許設置HTTP header的最簡易方法是在HTML中使用“HTTP同義(HTTP-equivalent)”的head標籤,像這樣:
http-equiv="Content-Type" content="text/html; charset=UTF-8" />
些微複雜當然也更好的方法是使用伺服器端腳本語言來發送header。用php的話,你可以這樣做:
header("Content-Type: text/html; charset= UTF-8"); ?>
如果你不願意(或不能)使用伺服器端腳本語言,你也許可以直接給伺服器設置一個“.htaccess”文件。大部分伺服器(Apache相容)可以在根目錄使用一個“.htaccess”的小文字文件,寫入下面的內容,你就可以把所有副檔名為“html”的文件都與MIME類型和字元集關聯:
AddType text/html;charset=UTF-8 html
字元集包括大部分西方基於拉丁文語言的“ISO-8859-1”,日語的“SHIFT_JIS”,簡體中文的“GB18030”和UTF-8,一個 Unicode Transformation Format版本,提供大範圍的多種語言的單個字元。基本上,你應該使用一個你知道的,能為你使用者清楚認知的字元集。除非你使用基於拉丁語的語言(包括英語,ISO-8859-1被普遍接受的),你應該使用UTF-8,因為它可以顯示大多數語言的大多數字元,使用它也是安全的,因為它可以在大部分的電腦上使用。
要知道關於更多,你可以閱讀The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。
注意
XHTML應該當作application/xhtml+xml的MIME類型來使用,再清楚不過,這是XML程序。不幸的是,大部分瀏覽器對這沒有第一線索,所以,一般認為使用text/html的MIME類型是不錯的。根據W3C的建議和Web Standards Project的強詷,調味的XHTML 1.0也許可以作text/html使用,但XHTML 1.1不應該。這也是本站以XHTML 1.0 Strict(嚴格)作為例子的原因。假定text/html的MIME類型。但是你仍然可以(或許不應該)為它們設置正確的MIME類型給瀏覽器,輕微的調整一下伺服器端即可。
這個網站使用PHP為XHTML 1.1設置application/xhtml+xml的MIME類型給那些能夠理解和處理這個類型的瀏覽器(如Mozilla),為XHTML 1.0 Strict設置text/html給其他瀏覽器(如IE)。為每一個頁面的頂部加入如下代碼:
if(stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml")){
header("Content-Type: application/xhtml+xml; charset=UTF-8");
echo('');
} else {
header("Content-Type: text/html; charset=UTF-8");
echo ('');
}
?>
這些檢查確認瀏覽器是否接受application/xhtml+xml的MIME類型,如果接受,就發送這個MIME類型並把XHTML 1.1文件類型寫到HTML中。如果這個MIME類型不被接受,就發送text/html的MIME類型並把XHTML 1.0 Strict(嚴格)的文件類型寫入HTML。
除了你知道你正在做著正確的事情和為自己準備將來的路的平和想法外,最直接的益處就是,使用這個方法,Mozilla瀏覽器把你的文件當作XML程式對待並且如果你的XHTML還沒有抓癢,就是說不合式的,Mozilla就不會工作。然後你就可以除錯了,而不需要用校驗器來檢驗你的文件了。
DOCTYPE使用方法
DOCTYPE 切換運作的方式:
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
這是 XHTML 1.0 Strict DOCTYPE,還有 Transitional 跟 Frameset DOCTYPE。
不完整的像這樣,會切到相容模式:"/DTD/xhtml1-strict.dtd">
兩者差異只在於前者用絕對路徑,後者用相對路徑。
當然,這是個正確的網址,你可以連去下載到該份 DTD,可是瀏覽器看到它時,不會真的去下載這 DTD,它只是用來判斷要切換成哪種模式罷了。
(另,IE 並不守規矩,網頁中只要出現 XHTML DOCTYPE,不論是否是完整網址,IE 都會切成標準模式。 但為了其他瀏覽器,建議還是用完整路徑)
(但,就算有完整路徑,只要網頁開頭有 這東東,稱為 XML Prolog,IE6就會切成相容模式 =.=)
以下列出各 DTD。
- 若有完整 URI 的 XHTML DOCTYPE,則切到標準模式,用 W3C 規則來讀網頁裡的 CSS 與 XHTML。
- 若有不完整或過時的 DOCTYPE 或沒有 DOCTYPE,就切成相容模式,
用傳統方法來處理網頁。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
這是 XHTML 1.0 Strict DOCTYPE,還有 Transitional 跟 Frameset DOCTYPE。
不完整的像這樣,會切到相容模式:"/DTD/xhtml1-strict.dtd">
兩者差異只在於前者用絕對路徑,後者用相對路徑。
當然,這是個正確的網址,你可以連去下載到該份 DTD,可是瀏覽器看到它時,不會真的去下載這 DTD,它只是用來判斷要切換成哪種模式罷了。
(另,IE 並不守規矩,網頁中只要出現 XHTML DOCTYPE,不論是否是完整網址,IE 都會切成標準模式。 但為了其他瀏覽器,建議還是用完整路徑)
(但,就算有完整路徑,只要網頁開頭有 這東東,稱為 XML Prolog,IE6就會切成相容模式 =.=)
以下列出各 DTD。
XHTML 1.0 Strict
可讓所有支援 DOCTYPE 的瀏覽器切成標準模式,
但是對 Opera 7.0 之前的版本,或 IE6 之前的版本無效。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional
讓 IE6+/Win 及 IE5+/Mac 切成標準模式。
使第一代 Gecko 瀏覽器(Mozilla 1.0,Netscape 6)切成標準模式。
使第二代 Gecko 瀏覽器(Mozilla 1.01,Netscape7+,Chimera 0.6+)切成
近乎標準模式。
對 Opera 7.0 之前的版本,或 IE6 之前的版本無效。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML 1.0 Frameset 讓 IE6+/Win 及 IE5+/Mac 切成標準模式。
使第一代 Gecko 瀏覽器(Mozilla 1.0,Netscape 6)切成標準模式。
使第二代 Gecko 瀏覽器(Mozilla 1.01,Netscape7+,Chimera 0.6+)切成
近乎標準模式。
對 Opera 7.0 之前的版本,或 IE6 之前的版本無效。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
XHTML 1.1此規格等同於 Strict,可讓所有支援 DOCTYPE 的瀏覽器切成標準模式,
但是對 Opera 7.0 之前的版本,或 IE6 之前的版本無效。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
HTML 4.01 Strict
會讓 IE 切成標準模式,新版的 Gecko 切成近乎標準模式。
"http://www.w3.org/TR/html4/strict.dtd">
但若用完整的 HTML 4.0 DOCTYPE,卻會使 IE 跟 Gecko 切成相容模式!
所以講了這麼多,目前的最佳解就是採用 XHTML (Transitional)。