2010-11-25 48 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');