专栏首页小狼的世界Apache环境下页面乱码的几种可能总结

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、解决一个乱码问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux系统管理员应该知道的journalctl知识

    通过--since和--until选项,可以过滤任意时间限制,显示指定条件之前、之后或之间的日志。

    大江小浪
  • 超越按钮,拥抱触摸界面

    苹果iPhone手机的发布,可以说带来了一个全新的“触摸”时代。现如今,就连小孩子都能够非常自然的使用一些触摸设备,手机、iPad等等。父母们一定很惊奇孩子们能...

    大江小浪
  • CoreDNS介绍

    开始之前先吐槽一下busybox中的nslookup命令。这个命令应该是实现的不是很完全,导致我在测试DNS的成功,得到了错误的信息。先来看一下

    大江小浪
  • jquery特殊字符问题处理

    问题:今天项目上有个地方使用 $(“#lamp”).load(‘/admin/checklogin.php?sid=’+sid); 这样传递的时候遇到空格就...

    苦咖啡
  • Nginx专题: 从编译安装到URL重写

    前言 本文主要实现使用Nginx作为Web服务器,并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中。 环境介绍...

    小小科
  • linux系统下用户切换(3)

    su [user] 和 su - [user]的区别: su [user]切换到其他用户,但是不切换环境变量,su - [user]则是完整的切换到新的用户环境...

    joshua317
  • Linux的su命令,sudo命令和限制root远程登录

      这个 - 选项是彻底切换用户的意思,如果不加 - 选项也可以,但是切换得不彻底,例如当前的家目录还是root,环境变量也还是root的配置等等:

    端碗吹水
  • cordova插件-Device Motion

    添加插件 $ cordova plugin addcordova-plugin-device-motion ? 图 12如上则插入成功 插件的使用 Me...

    roc
  • 详细grep、sed、awk

    [root@VM_0_7_centos tmp]# cat 1.txt 1 2 3 4 5 6 [root@VM_0_7_centos tmp]# cat 2...

    用户1173509
  • 萌新刷题(十二)二叉树的前序遍历

    题目 给出一棵二叉树,返回其节点值的前序遍历。 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / ...

    小歪

扫码关注云+社区

领取腾讯云代金券