页面乱码问题的根源及其分析


Posted in PHP onAugust 09, 2013

首先, 关闭PHP配置文件php.ini中的default_charset:
1. 页面没有指定charset , Apache配置defaultcharst gbk , 页面文件编码是utf-8
结果: 乱码,使用wireshark抓包,发现服务器返回的header中指明了:

Content-Type:text/html;charset=GB

结论:当页面没有指明charset的时候,Apache的defaultcharset起作用

2. 页面指定charset为utf-8, Apache配置defaultcharset gbk. 页面文件是utf-8

<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
        <div id="page-header">
         测试Apache DefaultCharset
        </div>
</body>
</html>

结果还是出现乱码。
结论:当Apache配置了DefaultCharset, 将忽略页面的charset申明。

3. PHP header申明charset为utf8, Apache配置defaultcharst gbk,页面文件编码是utf8

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

结果 : 页面显示正常。

4 Apache设置DefaultCharset off
结果,页面显示正常。

翻阅了下Apache2的手册:
AddDefaultCharset指令
说明当应答内容是text/plain或text/html时,在HTTP应答头中加入的默认字符集
语法AddDefaultCharsetOn|Off|charset
默认值AddDefaultCharsetOff
作用域serverconfig,virtualhost,directory,.htaccess
覆盖项FileInfo
状态核心(C)
模块core
当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的
默认字符集。理论上这将覆盖在文档体中通过<meta>标 签指定的字符集,但是实际
的行为通常取决于用户浏览器的设置。AddDefaultCharsetOff将会禁用此功能。
AddDefaultCharsetOn将启用Apache内部的默认字符集iso-8859-1。您
也可以指定使用在IANA注册过的字符集名字 中的另外一个charset。
比如说:
AddDefaultCharsetutf-8

也就是说,当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。
当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端

最后,还有一个问题没有得出结果:
当Apache和页面都没有指定的时候, 又如何?
我在自己的机器上,如果都不指定, 默认还是utf8.

PHP 相关文章推荐
用PHP实现的随机广告显示代码
Jun 14 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
如何使用PHP给图片加水印
Oct 12 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
Jan 02 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 #PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 #PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 #PHP
php接口与接口引用的深入解析
Aug 09 #PHP
解析数组非数字键名引号的必要性
Aug 09 #PHP
php防注入及开发安全详细解析
Aug 09 #PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 #PHP
You might like
几种显示数据的方法的比较
2006/10/09 PHP
PHP 选项及相关信息函数库
2006/12/04 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
php 购物车的例子
2009/05/04 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
php在线代理转向代码
2012/05/05 PHP
php密码生成类实例
2014/09/24 PHP
Thinkphp中数据按分类嵌套循环实现方法
2014/10/30 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
js密码强度检测
2016/01/07 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
关于青春的演讲稿
2014/05/05 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
科技活动总结范文
2015/05/11 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL