Press "Enter" to skip to content

页面乱码问题根源浅析

这个问题已经遇到过俩次了,就是页面中明确指明了编码是UTF8,但是显示是乱码。
虽然知道解决方法,也知道是Apache的原因,但是一直没有去找其所以然,今天趁机,就研究了一下。
首先, 关闭PHP配置文件php.ini中的default_charset:
1. 页面没有指定charset , Apache配置defaultcharst gbk , 页面文件编码是utf-8
结果: 乱码,使用wireshark抓包,发现服务器返回的header中指明了:

Content-Type:text/html;charset=GBK

结论:当页面没有指明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.

9 Comments

  1. Payoneer中国
    Payoneer中国 March 31, 2016

    这个网站是一个奇妙的网站。因此,我在这里提出一个建议:
    现在,在中国,你必须发送,并通过了世界上最好的汇款服务收钱的选项。注册,您将收到一个免费的借记卡,你可以从自动取款机直接拿钱。注册并免费获得25美元,第一次加油卡。中国Payoneer提供了超过200个国家,只有几个小时所支付的可能性。不要错过这个服务。

  2. windows aduro samsung
    windows aduro samsung November 9, 2014

    I like the helpful information you supply on your articles.
    I will bookmark your blog and test again here frequently. I’m slightly sure I’ll learn many new stuff proper right here!
    Best of luck for the following!

  3. 哈哈镜
    哈哈镜 October 18, 2013

    当Apache和页面都没有指定的时候,就是浏览器默认的了,不同浏览器的默认编码是不同的

  4. […] 问题就在于,没有一个统一的标准,来指明这俩中方式的优先级, 不同的浏览器有着不同的优先级策略.这也就是为什么,我们在FF下正常浏览的页面,在IE下会乱码的原因. 我之前的文章Apache的Charset设置中已经介绍过了在Apache下设置DefaultCharset以后产生的影响, […]

  5. erik
    erik September 4, 2010

    都不指定的话由bom决定

  6. […] 问题就在于,没有一个统一的标准,来指明这俩中方式的优先级, 不同的浏览器有着不同的优先级策略.这也就是为什么,我们在FF下正常浏览的页面,在IE下会乱码的原因. 我之前的文章Apache的Charset设置中已经介绍过了在Apache下设置DefaultCharset以后产生的影响, […]

Comments are closed.