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語句,它表示列值使用了什麼字符集。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章