wangyan188 发表于 2015-8-4 12:33:32

Apache环境下页面乱码的几种可能总结

  采用典型的LAMP架构开发的时候,环境中多处涉及到编码的指定,有一个地方忽略,都有可能造成页面汉字乱码的产生,本文将总结这些乱码产生的可能的原因,方便我们排查。
  1、页面中的问题。
  每个网页文件都有其编码,同时网页文件的源码中,也有一个位置会告诉浏览器,这个页面应该用什么样的编码去解释。
     
  这里指定的编码应该和页面本身的编码一致,否则就会产生乱码。
  还有一个需要注意的问题:当在ie浏览器下面浏览网页面的时候使用 utf-8 编码,标签被放在标签前面。当title为中文的时(比如Blog名为中文或者文章标题为中文),在 IE下会出现显示空白页的问题。而使用gbk或者gb2312等编码就不会有什么问题了。
  这个问题是由于 utf-8 使用3个字节表示一个汉字,而GB2312或BIG5使用两个字节。页面输出时,由于上述原因,使浏览器解析、输出 的内容时,如果在前有奇数个全角字符时,IE把 UTF-8 当作两个字节解析时出现半个汉字的情况,这时该半个汉字会和的部分,致使整个页面为空百输出。此时查看源文件,会发现实际上整个页面全部已经下载了。
  浏览器获得编码的方式:
  HTTP Header中的"Content-Type”项;   
返回的html代码开头是否有BOM(Byte of Marker);   
html代码中的 meta 标签;
  浏览器解码解析网页的过程:
  浏览器(无论是IE还是Firefox)在解析页面时,首先取HTTP Header中的Content-Type项,如果有写明charset的话就认定页面的编码方式为charset指定的值。如果没有指明,则认定为默认值。根据上表,IE中文版的默认值是GB2312,Firefox中文版的默认值是GBK,不过IE的GB2312好像和GBK没啥区别。然后,浏览器会看一下有没有BOM。一旦发现有UTF-8的3字节BOM,则重新认定页面的编码方式为UTF-8。
  解码阶段,解码完成后是解析html的阶段。解析html的过程中,当解析到head部分的meta标签时,浏览器会根据这个语句中的说明,重新认定编码方式为charset后面的方式,中断html解析过程,返回到解码步骤重新解码。
  meta标签的作用:
  “meta是用来在HTML文档中模拟HTTP协议的响应头报文。”在meta标签中写和在HTTP头里写是一样的,这也是为了解决用普通 HTML写网页的人无法自行定义HTTP头的问题。但是,meta是一个html标签,所以必须进入到html解析的步骤才能生效,而生效后,浏览器会退回几步,重新设置好HTTP头从头再开始解码、解析html。所以meta中写的内容会覆盖HTTP头里的内容,无论哪个浏览器都是这样的。
  2、Apache的DefaultCharset配置。
  Apache2的配置中有这么一项 AddDefaultCharset ,默认这项设置在配置文件中并没有指定的。
     AddDefaultCharset 指令   
说明   当应答内容是text/plain或text/html时,在HTTP应答头中加入的默认字符集      
语法   AddDefaultCharset On|Off|charset      
默认值   AddDefaultCharset Off      
作用域   server config, virtual host, directory, .htaccess      
覆盖项   FileInfo      
状态   核心(C)      
模块   core
  当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过标 签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。 AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字 中的另外一个charset 。比如说: AddDefaultCharset utf-8
  也就是说,当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。 当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端。
  这样,我们就清楚了,服务器配置一般不选择这一项,就给我们页面编写带来了很多灵活性。同一个服务器中,可以存在不同编码的网页。当然,这并不是一个很好的习惯。
  参考资料:
     1、IE中打开UTF-8编码的页面中title显示空白的问题      
2、解决一个乱码问题
页: [1]
查看完整版本: Apache环境下页面乱码的几种可能总结