php的header來定義一個php頁面爲utf編碼或GBK編碼
php頁面爲utf編碼
header("Content-type: text/html; charset=utf-8");
php頁面爲gbk編碼
header("Content-type: text/html; charset=gb2312");
php頁面爲big5編碼
header("Content-type: text/html; charset=big5");
一般狀況以上代碼放在php頁面的首頁
用header或meta實現PHP頁面編碼的區別
1、頁面編碼
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(),便於放到服務器上能正常顯示。
2、數據庫編碼
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頁面編碼統一
MySQL數據庫編碼、html頁面編碼、PHP或html文件自己編碼要所有一致。
一、MySQL數據庫編碼:創建數據庫時指定編碼(如gbk_chinese_ci),創建數據表、創建字段、插入數據時不要指定編碼,會自動繼承數據庫的編碼。
數據庫鏈接時,也有編碼,能夠在鏈接完數據庫後,執行
mysql_query('SET NAMES gbk');//將gbk換成你的編碼,如utf8。
二、html頁面的編碼,指的是這一行的設置:
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
三、PHP或html文件自己的編碼:用editplus打開php文件或html文件,另存時,選擇的編碼,若是數據庫和頁面編碼是gbk,則這兒的編碼選擇ansi;若是數據庫和頁面編碼是utf-8,則這兒也選擇utf-8。
四、另外要注意的是,Javascript或Flash中傳遞的數據是utf-8編碼,若是數據庫和頁面編碼是gbk,要進行轉碼,而後寫入數據庫。
iconv('utf-8', 'gbk', $content);
五、在PHP程序中,能夠加上一行,來指定PHP源程序的編碼:
header('Content-type: text/html; charset=gbk');php