HTML5学堂:网页中可以使用meta进行编码的声明,对于PHP文件可以使用header进行编码的设置,数据库、后台、前端,各自均有相应的编码,那么如何保持编码的一致性,并且在网页中能够正常显示
刘国利 - 独行冰海:郑重声明,本文参照了来自脚本之家的一篇文章,原文名为“PHP 页面编码声明与用header或meta实现PHP页面编码的区别”是2010年书写的,当前尹鹏老师和我根据当前前端对PHP技术的需求,调整了文章中的具体内容,也更改了讲解方式,也针对知识进行了一定的修改。
PHP页面编码设置为utf编码
header("Content-type: text/html; charset=utf-8");
PHP页面编码设置为gbk编码
header("Content-type: text/html; charset=gb2312");
通常情况以上代码放在php页面的首页
这个应该说是我们使用最多的一种编码格式设置。
使用 <meta http-equiv="content-type" content="text/html; charset=xxx"> 标签设置页面编码
这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx可以为GB2312,GBK,UTF-8等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。
但是有时,即便是设置了meta,而且无论meta的字符编码格式是哪种,浏览器采用的始终都是一种编码,<meta>是属于html信息的,仅仅是一个声明,它起作用表明服务器已经把HTML信息传到了浏览器。
针对一个PHP页面,有时我们也会设置header("content-type:text/html; charset=xxx")。当一个页面当中既出现了<meta http-equiv="content-type" content="text/html; charset=xxx">,又进行了meta的设置,浏览器就只认前者http标头而不认meta了。
https标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串。由于meta标签是属于html信息的,所以header()发送的内容先到达浏览器,这也就导致了浏览器只认前者http标头而不认meta。
欢迎沟通交流~HTML5学堂
Apache 根目录的 conf 文件夹里,有整个Apache的配置文档httpd.conf。
在文档当中,大约700行左右,有AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件https标头里的字符集为你默认的xxx字符集。有这行,就相当于给每个文件都 加了一行header("content-type:text/html; charset=xxx")。因此,这也就解释了为何有时即便没在PHP文件中设置header,设置了meta为utf-8,但浏览器依旧以gb2312的方式响应。如果注释掉AddDefaultCharset这句,而且页面里不含header("content-type…"),那这个时候就轮到meta标签起作用了。
1、如果你是WEB程序,给你的每个页面都加个header("content-type:text/html; charset=xxx"),保证它在任何服务器都能正确显示,可移植性强。至于那句AddDefaultCharset xxx,要不要注释就仁者见仁了。可以注释,也可以调整修改。
2、关于数据库编码。PHP 程序在查询数据库之前,首先执行 mysql_query(“set names xxxx”);其中 xxxx 是你网页的编码(charset=xxxx),如果网页中 charset=utf-8,则 xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入 mysql_query(“set names 'xxx'”)就可以了。
set names 显示客户端发送的 SQL 语句中使用什么字符集。因此,set names 语句告诉服务器“将来从这个客户端传来的信息采用XX字符集”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一 个SELECT语句,它表示列值使用了什么字符集。)
3、保持MySQL数据库编码、html页面编码、PHP或html文件编码的一致性。
4、JavaScript或Flash中传递的数据是utf-8编码,如果数据库和页面编码是gbk,要进行转码,然后写入数据库。
欢迎沟通交流~HTML5学堂