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


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中将网址转换为超链接的函数
Sep 02 PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
php生成随机数的三种方法
Sep 10 PHP
PHP中文编码小技巧
Dec 25 PHP
php绘制一条弧线的方法
Jan 24 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP实现多图片上传类实例
2014/07/26 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
工商技校毕业生自荐信
2013/11/15 职场文书
实习生自我鉴定
2013/12/12 职场文书
处级干部考察材料
2014/12/24 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript