IT技术博客大学习 共学习 共进步

剖析网页字符集的设置顺序

360weboy 2013-07-08 22:45:40 浏览 2,722 次

   上个星期在为一个电子商务网站进行数据转移到新系统中的时候,发现一些产品描述字符老是输出乱码,确定是字符集的问题以后,对字符集再次进行了一次调研,确定了影响页面字符集的方式主要下面几种方式:

   1. 文件的编码方式

   2. Apache2的默认字符集设置

   3. PHP.ini中的默认字符集的设置

   4. PHP脚本中手动输出header(‘Content-type:text/html;charset=xxx’);

   5. html页面中加入

   我对以上五种方式都进行了一一测试,并且确定了5种方式对于浏览器字符集选择的优先级。首先我创建了一个以utf8编码的test.php文件,内容如下:

   

   我使用chrome访问test.php, 因为我的chrome浏览器的默认字符集不是utf8,应该是gb2312或者gbk,所以我在浏览器中看到了如下乱码:

   

header与meta的优先级比较

   接下来,先来测试以上的4,5两种方式。我向html页面中分别加入了,内容显示正常。

   

   

   去掉header中的meta标签,加入header(‘Content-type:text/html;charset=utf8′);内容显示正常。那么,meta标签和header的方式,那个优先级高呢,我在页面里同时设置了这两项,header设置为gb2312, meta设置为utf8:

   

   结果内容显示不正常,说明header的优先级高。浏览器先采用http头部中的字符集设置,然后是html页面中meta标签设置的字符集

   

php.ini中设置默认字符集以后的影响

   接下来,我们来看下在php.ini中设置默认字符集以后的情形。为了测试下优先级,我们先将页面中的header以及meta设置的字符集都改为gb2312,那么这样内容肯定显示为乱码。然后,我们打开php.ini文件,找到如下设置,去掉前面的引号,设置字符集为utf8:

   

   设置好以后,记得要重启下apache2服务器,结果显示如下:

   

   我们看到,在php.ini设置默认字符集为utf8以后,它被加入到了响应头Content-type末尾,从而覆盖了在php脚本中通过header函数输出的gb2312的字符集,浏览器根据该头部中的信息,认为内容是utf8的字符集,最后内容现实正常。由此可见,php.ini中字符集设置的优先级高于header函数以及meta标签。

apache2中设置默认字符集

   最后,我们来设置下apache2中的默认字符集来测试下。这次将header,meta,php.ini中的字符集都设置为gb2312,然后在apache2设置默认字符集为utf8:

   

   重启apache2服务器,内容显示如下:

   

   由此可见,apache2中的字符集的设置没有影响到http响应中的Content-Type头部,所以浏览器认为应该用gb2312来解码,导致出现乱码。那么,如果去掉php.ini中的字符集的设置以后内,页面是否会显示正常。经过测试,显示如下:

   

   看来,apache2中的字符集的优先级同样小于header函数的字符集设置。我们继续去掉header的设置看下:

   

   以上证明,apache2中的字符集设置的优先级高于meta标签的字符集设置。charset=utf8加入到了http头部中。

   综合上述实验,得出字符集设置优先级顺序: php.ini默认字符集设置 > header函数字符集设置 > apache2默认字符集设置 > meta标签字符集设置

建议继续学习

  1. ORACEL RAC 字符集 (阅读 5,362)
  2. linux下vim的编译以及终端乱码的最终解决方案 (阅读 4,742)
  3. 区分一个包含汉字的字符串是 UTF-8 还是 GBK (阅读 4,041)
  4. oracle查看字符集 修改字符集 (阅读 3,845)
  5. 如何在MYSQL5.5只支出utf8环境下正常使用GBK网站 (阅读 3,704)
  6. java中文乱码解决之道(一)—–认识字符集 (阅读 3,643)
  7. mysql latin1转utf8 的两种方法 (阅读 3,344)
  8. mysql字符集和校验规则概念小介 (阅读 3,242)
  9. mysql字符集与校验规则的设置 (阅读 3,062)
  10. mysql连接通道中的字符集和校验规则 (阅读 2,942)