天天看點

用header或meta實作PHP頁面…

原文位址:用header或meta實作PHP頁面編碼的差別 作者:小葉子 一、頁面編碼

  1. 使用 <META http-equiv="content-type" content="text/html; charset=xxx"> 标簽設定頁面編碼

   這個标簽的作用是聲明用戶端的浏覽器用什麼字元集編碼顯示該頁面,xxx可以為GB2312,GBK,UTF-8(和MySQL不同,MySQL是 UTF8)等等。是以,大部分頁面可以采用這種方式來告訴浏覽器顯示這個頁面的時候采用什麼編碼,這樣才不會造成編碼錯誤而産生亂碼。但是有的時候我們會 發現有了這句還是不行,不管xxx是哪一種,浏覽器采用的始終都是一種編碼,這個情況我後面會談到。

  請注意,<meta>是屬于html資訊的,僅僅是一個聲明,它起作用表明伺服器已經把HTML資訊傳到了浏覽器。

  2. header("content-type:text/html; charset=xxx");

  這個函數header()的作用是把括号裡面的資訊發到http标頭。

   如果括号裡面的内容為文中所說那樣,那作用和<META>标簽基本相同,大家對照第一個看發現字元都差不多的。但是不同的是如果有這段函 數,浏覽器就會永遠采用你所要求的xxx編碼,絕對不會不聽話,是以這個函數是很有用的。為什麼會這樣呢?那就得說說HTTPS标頭和HTML資訊的差别 了:

  https标頭是伺服器以HTTP協定傳送HTML資訊到浏覽器前所送出的字串。

  因為meta标簽是屬于 html資訊的,是以header()發送的内容先到達浏覽器,通俗點就是header()的優先級高于meta(不知道可不可以這樣講)。加入一個 php頁面既有header("content-type:text/html; charset=xxx"),又有<META http-equiv="content-type" content="text/html; charset=xxx">,浏覽器就隻認前者http标頭而不認meta了。當然這個函數隻能在php頁面内使用。

  同樣也留有一個問題,為什麼前者就絕對起作用,而後者有時候就不行呢?這就是接下來要談的Apache的原因了。

  3. AddDefaultCharset

  Apache 根目錄的 conf 檔案夾裡,有整個Apache的配置文檔httpd.conf。

   用文本編輯器打開httpd.conf,第708行(不同版本可能不同)有AddDefaultCharset xxx,xxx為編碼名稱。這行代碼的意思:設定整個伺服器内的網頁檔案https标頭裡的字元集為你預設的xxx字元集。有這行,就相當于給每個檔案都 加了一行header("content-type:text/html; charset=xxx")。這下就明白為什麼明明meta設定了是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  

  <META http-equiv="content-type" content="text/html; charset=xxx">  

  如果你是web程式員,給你的每個頁面都加個header("content-type:text/html; charset=xxx"),保證它在任何伺服器都能正确顯示,可移植性強。

  至于那句AddDefaultCharset xxx,要不要注釋就仁者見仁了。反正我是注釋掉了,不過我寫頁子也要寫header(),便于放到伺服器上能正常顯示。

  二、資料庫編碼

   PHP 程式在查詢資料庫之前,首先執行 mysql_query(“SET NAMES xxxx”);其中 xxxx 是你網頁的編碼(charset=xxxx),如果網頁中 charset=utf8,則 xxxx=utf8,如果網頁中 charset=gb2312,則xxxx=gb2312,幾乎所有WEB程式,都有一段連接配接資料庫的公共代碼,放在一個檔案裡,在這檔案裡,加入 mysql_query(“set names”)就可以了。

  SET NAMES 顯示用戶端發送的 SQL 語句中使用什麼字元集。是以,SET NAMES 'utf-8'語句告訴伺服器“将來從這個用戶端傳來的資訊采用字元集utf-8”。它還為伺服器發送回用戶端的結果指定了字元集。(例如,如果你使用一 個SELECT語句,它表示列值使用了什麼字元集。)

php