使用PHP将HTTP标头设置为UTF-8

man*_*ese 307 html php http-headers

我有几个PHP页面使用以下代码将各种内容回显到HTML页面中.

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

但是,当我使用W3C验证器验证时,它会出现:

HTTP标头(iso-8859-1)中指定的字符编码与元素(utf-8)中的值不同.

我是PHP的新手,我想知道我是否可以并且应该更改PHP文件的标头以匹配HTML文件.

Gum*_*mbo 872

使用header修改HTTP标头:

header('Content-Type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

注意在将任何输出发送到客户端之前调用此函数.否则标题也已发送,您显然无法再更改它.你可以检查一下headers_sent.有关更多信息,请参见手册页header.

  • 这只适用于执行php,为静态页面执行,你应该保存你的html文件AS utf-8.这样做会将BOM字符utf-8编码添加到文件的开头.字节0xEF,0xBB,0xBF添加到文件的开头.大多数Web服务器会注意到这一点并应用适当的标头.实际上将你的php文件保存为utf-8,可以完成同样的事情. (6认同)
  • 我只想补充一点,当你像这样正确设置HTTP头时,你根本就不需要`<meta>`标签了. (4认同)
  • @Jon:我会同时使用两者.当HTML文档未通过HTTP加载时(例如从磁盘加载),使用HTTP等效的"META". (3认同)

Kin*_*nch 32

首先确保PHP文件本身是UTF-8编码的.

某些浏览器会忽略元标记.如果你只使用ASCII字符,那么无论如何都没关系.

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

header('Content-Type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)


Edo*_*odo 15

这是您的Web服务器发送的HTTP标头与您定义的HTTP标头不匹配的问题.有关如何使服务器发送正确标头的说明,请参阅此页面.

否则,您也可以使用PHP来修改标题,但必须使用此代码输出任何文本之前完成此操作:

header('Content-Type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

有关如何使用PHP发送标头的更多信息可以在头文件功能的文档中找到.


Jas*_*OOO 12

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

<?php header('Content-Type: charset=utf-8'); ?>
Run Code Online (Sandbox Code Playgroud)

请参阅RFC 2616,其有效仅指定字符集.


小智 10

为了正确实现,您需要更改一系列内容.

数据库.(连接后立即):

mysql_query("SET NAMES utf8");

// Meta tag HTML (probably it's 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
Run Code Online (Sandbox Code Playgroud)

  • 数据库的联盟不会影响PHP生成的输出,因为数据被编码为配置为与PHP一起使用的本机格式,然后才返回给用户.其次OP没有提到他正在使用MySQL.第三,MyISAM已经过时,除非你知道你在做什么,否则不应该被推荐.有一个原因InnoDB成为新的默认设置. (4认同)

小智 6

如果设置为使用内部编码,则PHP自动发送标头:

ini_set('default_charset', 'utf-8');
Run Code Online (Sandbox Code Playgroud)