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


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
Nov 25 PHP
笑谈配置,使用Smarty技术
Jan 04 PHP
php中去除所有js,html,css代码
Oct 12 PHP
解析link_mysql的php版
Jun 30 PHP
php获取$_POST同名参数数组的实现介绍
Jun 30 PHP
php中的比较运算符详解
Oct 28 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 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
星际RPG字典
2020/03/04 星际争霸
ASP和PHP都是可以删除自身的
2007/04/09 PHP
PHP小教程之实现链表
2014/06/09 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
python的re模块应用实例
2014/09/26 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python global全局变量函数详解
2018/09/18 Python
python统计中文字符数量的两种方法
2019/01/31 Python
原生python实现knn分类算法
2019/10/24 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Ajax的工作原理
2015/12/04 面试题
物业工作计划书
2014/01/10 职场文书
接受捐赠答谢词
2014/01/27 职场文书
餐厅筹备计划书
2014/04/25 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2014年建筑工作总结
2014/11/26 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript