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

采用典型的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编码方式给客户端。

这样,我们就清楚了,服务器配置一般不选择这一项,就给我们页面编写带来了很多灵活性。同一个服务器中,可以存在不同编码的网页。当然,这并不是一个很好的习惯。

参考资料:

1、IE中打开UTF-8编码的页面中title显示空白的问题
2、解决一个乱码问题

时间: 2024-08-01 23:31:36

Apache环境下页面乱码的几种可能总结的相关文章

php在apache环境下实现gzip配置方法_php技巧

本文实例讲述了php在apache环境下实现gzip配置方法.分享给大家供大家参考.具体如下: 1.conf/httpd.conf 1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#, 2) 添加LoadModule deflate_module modules/mod_deflate.so, 3) 去掉#Include conf/extra/httpd-vhosts.conf前面的注释#.  2.conf/extra/htt

云计算环境下基于Mashup的一种电信网络能力服务提供模式

云计算环境下基于Mashup的一种电信网络能力服务提供模式 刘勇 乔秀全 李晓峰 在电信运营商逐步开放其电信能力API的背景下,基于Mashup的业务构建模式,提出了一种云计算环境下的电信网络能力服务提供模式.该模式将Mashup的理念移植到电信能力上,并将电信能力封装成Web Element的形式呈现给用户,进一步提升了电信网络能力服务的抽象层次. 关键词:云计算环境 Telecom 2.0 Mashup 服务提供模式 Web Element [下载地址]:http://bbs.chinacl

JSP页面乱码的5种解决方法

JSP编程中网页显示出现乱码的情况,基本可以归为5类: 1. JSP页面显示乱码. 2. Servlet接收Form/Request传递的参数时显示为乱码 3. JSP接收Form/Request传递的参数时显示为乱码 4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码 5. 数据库存取的时候产生乱码. 下面给出全部解决方法: 步骤/方法 1. JSP页面显示乱码. 第一种为在页面的开头加上:

在Apache环境下成功的运行ASP.NET的注意事项_实用技巧

由于公司的产品在新的版本中,需要考虑一些新的部署方式,所以又抽空关注了一下.NET跨平台的一些解决方案.虽然Mono Project对基于.NET开发的人来说都不陌生,不过由于Mono是比较狭义的跨平台(因为它是OS级别的)概念.而从广义的角度来说,使用不同的Web Server也可以算是一种垮平台.     缘起是由于IIS的口碑实在太滥,以至于不少的关键应用场景明文禁止安装和使用IIS.而从ASP.NET的执行原理来看,它是通过一个Web Server处理tcp请求,然后把对ASPX执行和呈

iframe下页面乱码的问题

问题描述 iframe里的页面中文字出现乱码问题,而且只在IE6下出现,IE8,firefox是没有问题的,而且页面中指定了编码为utf-8,但是在iframe中打开的时候就成乱码,右键查看编码是gb2312,单独打开这个页面显示正常,右键查看编码为utf-8,请问这是为什么,有什么蟹决办法 解决方案 解决方案二:IE6很河蟹解决方案里整体设置一个编码方式试试解决方案三:你外面页和内嵌页的编码不一致..解决方案四:检查页面是否设置charset解决方案五:我也遇到了此问题,请问兄弟是否已解决?

Apache环境下PHP利用HTTP缓存协议原理解析及应用分析_php基础

对于静态页面还有Etag. 一.先来看第一种情况:apache 静态页面 apache发送给客户端的静态页面一般包含Last-Modified和Etag,这两个标签的值来自静态文件的修改时间和inode. 下面是截取得apache返回客户端的头 XML/HTML代码 复制代码 代码如下: Last-Modified: Fri, 26 Jan 2007 01:53:34 GMT ETag: "3f9f640-318-cb9f8380" 搜索引擎之所以喜欢静态文件是因为有这两个标识,可以判

apache 环境下 php 的配置

PHP 以 CGI 方式安装到 Apache 2.0: 将如下指令插入到 Apache 的 httpd.conf 配置文件中,以设置 CGI 二进制文件: ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php Action application/x-httpd-php "/php/php.exe" PHP 以模块方式安装到 Apache 2.0: 移动 php4ts.dll 或者 php5

apache 环境下 php 的配置注意事项_服务器

PHP 以 CGI 方式安装到 Apache 2.0:     将如下指令插入到 Apache 的 httpd.conf 配置文件中,以设置 CGI 二进制文件:    ScriptAlias /php/ "c:/php/"    AddType application/x-httpd-php .php    Action application/x-httpd-php "/php/php.exe"  PHP 以模块方式安装到 Apache 2.0:      移动

WIN环境下使Apache支持ASP.NET

apache|asp.net 程序,不仅在UNIX/LINUX平台上被大量使用,而且在Windows平台上也有许多站点放弃了IIS而转向Apache..NET是微软推出的功能强大的开发技术,其目标就是与Java抗衡.ASP.NET非常适合于中小企业的Web应用,其性能较ASP3.0有了极大的提高.下面就介绍让Apache支持ASP.NET的办法. 首先,必须要有Windows环境和.NET Framework的支持.此外还建议安装安装.NET开发工具如.NET Framework SDK或者Vi