1) 使用 標籤設定頁面編碼
這個標籤的作用是聲明用戶端的瀏覽器用什麼字元集編碼顯示該頁面,xxx 可以為 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF8)等等。因此,大部分頁面可以採用這種方式來告訴瀏覽器顯示這個頁面的時候採用什麼編碼,這樣才不會造成編碼錯誤而產生亂碼。但是有的時候我們會發現有了這句還是不行,不管 xxx 是哪一種,瀏覽器採用的始終都是一種編碼,這個情況我後面會談到。
請注意, 是屬於 HTML 資訊的,僅僅是一個聲明,僅表明伺服器已經把 HTML 資訊傳到了瀏覽器。
2) header(“content-type:text/html; charset=xxx”);
這個函數 header() 的作用是把括弧裡面的資訊發到 http 標題。如果括弧裡面的內容為文中所說那樣,那作用和 標籤基本相同,大家對照第一個看發現字元都差不多的。但是不同的是如果有這段函數,瀏覽器就會永遠採用你所要求的 xxx 編碼,絕對不會不聽話,因此這個函數是很有用的。為什麼會這樣呢?那就得說說 http 標題和 HTML資訊的差別了:
http 標題是伺服器以 http 協議傳送 HTML 資訊到瀏覽器前所送出的字串。而 標籤是屬於 HTML 資訊的,所以 header() 發送的內容先到達瀏覽器,通俗點就是 header() 的優先順序高於 (不知道可不可以這樣講)。假如一個 php 頁面既有header(“content-type:text/html;charset=xxx”),又有,瀏覽器就只認前者 http 標題而不認 meta 了。當然這個函數只能在 php 頁面內使用。
同樣也留有一個問題,為什麼前者就絕對起作用,而後者有時候就不行呢?這就是接下來要談的Apache 的原因了。
3) AddDefaultCharset
Apache 根目錄的 conf 檔案夾裡,有整個 Apache 的配置文檔 httpd.conf。
用文字編輯器開啟 httpd.conf,第 708 行(不同版本可能不同)有 AddDefaultCharset xxx,xxx為編碼名稱。這行代碼的意思:設定整個伺服器內的網頁檔案 http 標題裡的字元集為你預設的 xxx字元集。有這行,就相當於給每個檔案都加了一行 header(“content-type:text/html; charset=xxx”)。這下就明白為什麼明明 設定了是 utf-8,可瀏覽器始終採用 gb2312 的原因。
如果網頁裡有 header(“content-type:text/html; charset=xxx”),就把預設的字元集改為你設定的字元集,所以這個函數永遠有用。如果把 AddDefaultCharset xxx 前面加個”#”,注釋掉這句,而且頁面裡不含 header(“content-type…”),那這個時候就輪到 meta 標籤起作用了。
下面列出以上的優先順序:
header(“content-type:text/html; charset=xxx”)
.. AddDefaultCharset xxx
..
如果你是 web 程式員,建議給你的每個頁面都加個header(“content-type:text/html;charset=xxx”),這樣就可以保證它在任何伺服器都能正確顯示,可移植性也比較強。
4) php.ini 中的 default_charset 配置:
php.ini 中的 default_charset = “gb2312″ 定義了 php 的預設語言字元集。一般推薦注釋掉此行,讓瀏覽器根據網頁頭中的 charset 來自動選擇語言而非做一個強制性的規定,這樣就可以在同台伺服器上提供多種語言的網頁服務。