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


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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
为查询结果建立向后/向前按钮
Oct 09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
php下MYSQL limit的优化
Jan 10 PHP
PHP中$_SERVER的详细参数与说明
Jul 29 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
PHP防止跨域提交表单
Nov 01 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
php-fpm服务启动脚本的方法
Apr 27 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
php格式输出文件var_export函数实例
2014/11/15 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Python内置类型性能分析过程实例
2020/01/29 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
如何利用python读取micaps文件详解
2020/10/18 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
平安建设实施方案
2014/03/19 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
vue router 动态路由清除方式
2022/05/25 Vue.js