PHP 頁面編碼聲明方法詳解(header或meta)

來源:互聯網
上載者:User

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. 使用 <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頁面編碼統一

MySQL資料庫編碼、html頁面編碼、PHP或html檔案本身編碼要全部一致。
  1、MySQL資料庫編碼:建立資料庫時指定編碼(如gbk_chinese_ci),建立資料表、建立欄位、插入資料時不要指定編碼,會自動繼承資料庫的編碼。
資料庫連接時,也有編碼,可以在串連完資料庫後,執行
mysql_query('SET NAMES gbk');//將gbk換成你的編碼,如utf8。

  2、html頁面的編碼,指的是這一行的設定:
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

  3、PHP或html檔案本身的編碼:用editplus開啟php檔案或html檔案,另存時,選擇的編碼,如果資料庫和頁面編碼是gbk,則這兒的編碼選擇ansi;如果資料庫和頁面編碼是utf-8,則這兒也選擇utf-8。

  4、另外要注意的是,Javascript或Flash中傳遞的資料是utf-8編碼,如果資料庫和頁面編碼是gbk,要進行轉碼,然後寫入資料庫。
iconv('utf-8', 'gbk', $content);

5、在PHP程式中,可以加上一行,來指定PHP來源程式的編碼:
header('Content-type: text/html; charset=gbk');

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.