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

原创 2012年03月28日 09:09:03
采用典型的LAMP架构开发的时候,环境中多处涉及到编码的指定,有一个地方忽略,都有可能造成页面汉字乱码的产生,本文将总结这些乱码产生的可能的原因,方便我们排查。

1、页面中的问题。

每个网页文件都有其编码,同时网页文件的源码中,也有一个位置会告诉浏览器,这个页面应该用什么样的编码去解释。

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8” />

这里指定的编码应该和页面本身的编码一致,否则就会产生乱码。

还有一个需要注意的问题:当在ie浏览器下面浏览网页面的时候使用 utf-8 编码,<title>标签被放在<meta>标签前面。当title为中文的时(比如Blog名为中文或者文章标题为中文),在 IE下会出现显示空白页的问题。而使用gbk或者gb2312等编码就不会有什么问题了。

这个问题是由于 utf-8 使用3个字节表示一个汉字,而GB2312或BIG5使用两个字节。页面输出时,由于上述原因,使浏览器解析、输出<title> </title>的内容时,如果在</title>前有奇数个全角字符时,IE把 UTF-8 当作两个字节解析时出现半个汉字的情况,这时该半个汉字会和</title>的<结合成一个乱码字,导致IE无法读完< title>部分,致使整个页面为空百输出。此时查看源文件,会发现实际上整个页面全部已经下载了。

浏览器获得编码的方式

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标签时,浏览器会根 据<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />这个语句中的说明,重新认定编码方式为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应答头中加入的默认字符 集。理论上这将覆盖在文档体中通过<meta>标 签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。 AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字 中的另外一个charset 。比如说: AddDefaultCharset utf-8

也就是说,当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。 当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端。

这样,我们就清楚了,服务器配置一般不选择这一项,就给我们页面编写带来了很多灵活性。同一个服务器中,可以存在不同编码的网页。当然,这并不是一个很好的习惯。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Apache 中文乱码问题解决方法

已经不记得解决过多少次这个问题了,但是每次都搞忘记,备忘一下。 服务器端:======修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/)查找:AddDefaul...

apache网页中文乱码

服务器端: ====== 修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/) 查找: AddDefaultCharset ISO-8859-1 改成:...

apache服务器下网页访问乱码解决办法

今天在浏览器下加载VLC控件来显示视频。html代码是网上down的, 视频剪辑    // document.oncontextmenu=function(e){re...

lamp平台下乱码问题的解决方法

在使用lamp平台制作网站的过程中,中文显示出现乱码的情况时有发生,就像下面图像展示的这样!

LAMP的中文字符乱码问题

最近学PHP,感觉还是蛮简单的。(当然主要我觉得不够深入,呵呵)但是发现LAMP中的中文字符编码问题真的是很讨厌。逛遍论坛发现这样的问题真的是有很多。哎,谁叫LAM都是外国人开发的呢?认命...  m...
  • deflag
  • deflag
  • 2006-04-19 14:57
  • 1630

JSP页面乱码的几种解决方案

几种解决jsp文件乱码的思路

PHP环境下utf8乱码的解决方法---apache,php配置问题

如果你在网上搜索   “ apache 配置 ” ,搜到的页面大多都会建议你在 httpd.conf 中加上这么一句: AddDefaultCharset GB2312 。对于新手...

jsp 页面常见的中文乱码问题总结

一、JSP页面显示乱码 1.jsp页面编码问题: 默认的jsp页面编码是iso8859-1编码的, 把它改成UTF-8. 2 jsp页面编码与解码不一致: 默认的jsp页面解码是ios8859-1编码...

jsp页面传值的乱码问题总结

jsp页面之间的传值乱码问题,总结如下: a.jsp往b.jsp传值: a.jsp页面内容:       name:       b.jsp页面内容: Str...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)