2010-11-25 77 views
272

我有幾個PHP頁面使用以下代碼在HTML頁面中回顯各種內容。使用PHP設置HTTP標頭爲UTF-8使用PHP

<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 

然而,當我驗證使用W3C validator談到了:

在HTTP報頭(ISO-8859-1)中指定的字符編碼距離值不同的元件( UTF-8)。

我對PHP很陌生,我想知道如果我可以並且應該更改PHP文件的標題以匹配HTML文件。

回答

800

使用header修改HTTP標頭:

header('Content-Type: text/html; charset=utf-8'); 

注前的任何輸出已經被髮送到客戶端調用這個函數。否則標題也被髮送了,你顯然不能再改變它了。你可以用headers_sent來檢查。有關更多信息,請參閱manual page of header

+3

我想補充一點,當你正確設置HTTP頭這樣,你根本不需要'`標籤。 – Jon 2010-11-25 16:55:55

+3

@Jon:我會使用兩者。當HTML文檔沒有通過HTTP加載(例如從磁盤加載)時,使用與HTTP等效的META。 – Gumbo 2010-11-25 16:59:09

+5

這將只在你執行php時才起作用,爲靜態頁面做,你應該保存你的html文件爲utf-8。這樣做會將BOM字符utf-8編碼添加到文件的開頭。字節0xEF,0xBB,0xBF添加到文件的開頭。大多數Web服務器都會注意到這一點,並應用適當的標題事實上,將你的php文件保存爲utf-8,可以達到同樣的效果。 – Rahly 2010-11-25 16:59:26

13

這是您的Web服務器發出一個HTTP標頭不匹配您定義的一個問題。有關如何使服務器發送正確標題的說明,請參閱this page

否則,你也可以使用PHP來修改標題,但是這必須完成之前使用該代碼的輸出任何文本:如何使用PHP可以發出頭

header('Content-Type: text/html; charset=utf-8'); 

更多信息被發現在the documentation for the header function

9

您還可以使用更短的方式:

<?php header('Content-Type: charset=utf-8'); ?> 

RFC 2616其有效僅指定字符集。

7

要正確實施,您需要更改一系列的東西。

數據庫(連接後):

mysql_query("SET NAMES utf8"); 
//Meta tag HTML.(probably its already set): 
meta charset="utf-8" 
header php.(before any output of the HTML): 
header('Content-Type: text/html; charset=utf-8') 
table-rows-charset(for each row): 
utf8_unicode_ci 
0

PHP自動發送頭,如果設置了內部編碼

ini_set('default_charset', 'utf-8');