日期:2014-05-17  浏览次数:20545 次

Html页面的编码问题

今天突然碰到了网页乱码问题,啥折腾了几个小时,算是明白了其中一点奥妙。自己掌握的知识还是太少了,老是觉得莫名其妙的问题,其实明白了它就是这样。


网页的编码由许多方面决定着,我目前整理的有如下四个方面:文件保存的编码类型,文件中声明的编码类型,服务器的编码类型,客户端的编码类型。

  1. 文件保存的编码类型。我平时可能很容易忽略这个,因为编辑器给我设置了一个默认的编码保存方式,一般是ANSI,这个值是可以更改的,越强大的编辑器可选择的编码类型越多。Windows上最简单的记事本在使用另存为方式保存文件时都可以设置要保存的编码类型。
  2. 文件中声明的编码类型。在写Html文件时,我可能都会忽略在<head>标签对中的这个声明: ?<meta http-equiv="Content-Type" content="text/html; charset=utf8" />,经过我简单的测试,我感觉其中charset的属性就是在告诉客户端(比如浏览器):我使用的是XXX编码,请使用对应的编码来解析我。如果不声明的话,浏览器会使用操作系统默认的语言环境所使用的编码来解析Html文件。
  3. 服务器的编码类型。这个一般都是写在某个配置文件中,大部分时候它可能没有启用。服务器其实挺聪明的,在没有启用默认编码的情况下,它会根据文件保存的编码类型自动解析后返回给客户端。如果启用了默认编码,则转换为默认编码后返回给客户端。所以这里最好是不要设置默认文件编码。(服务器环境有些复杂,这个东西理解可能有问题)
  4. 客户端的编码类型。以浏览器为例,可以设置查看网页所使用的编码类型。找找各大浏览器设置项里面的编码/Encoding总会找到一大串的编码类型,看得你头晕。一般我们都不会去动这个设置项,它已经非常精明。勾上自动选择/Auto detect 项之后基本上就万事大吉了。
接下来就看看乱码是怎么出现的了。
首先要说明的是,如果上面四个方面的编码类型都是一致的话,那么绝对不会有乱码问题出现。如果真有乱码问题,那估计是人品问题了,哈哈~这里暂时没有考虑从数据库取出数据以及表单提交数据两方面。
在中文情况下,常见的问题是1中使用了默认的ANSI,2中声明用utf8,或者1中使用utf8,2中声明用gb2312,两种情况都是会出问题的。但当1中使用ANSI,2中使用gb2312或者不声明时,大部分情况下是正常的。我暂时认为ANSI和gb2312这种组合没问题是因为它们使用同样的字节位数来储存信息的,而utf8则跟他们不一样,采用更多位数来储存信息,才能满足各个国家需要的国际标准。
既然如此,那我们为什么还提倡用utf8呢,其实也就是为了解决那小部分情况。当浏览器所在的操作系统非中文且未安装中文环境时,浏览gb2312编码的页面时将会是一片乱码,而utf8编码的页面则不会出现这种问题。

接下来看看数据库的数据输出以及表单提交数据的问题了。
同样的道理,数据库储存的数据和表单中输入的数据也有自己的编码类型,当这些编码类型与我们页面设置的数据不一致时,出现乱码也是在情理之中。我们要控制的就是在数据流入流出之前做转换就不会有问题了。我记得在Java中比较理想的解决方案是通过建立全局的过滤器机制来处理的。想必其它的编程语言也有类似的处理机制。当然你不嫌累,也可以在每个出入口拦截转换。

另外,当我们浏览的网站出现乱码时,如果是中文网站的话,其实很容易解决的。在浏览器的编码设置里,换一下编码类型utf8/gb2312/gbk/gb18030/big5,如果还不行的话,估计又是人品问题了,那网站也没救了。

---------------------
本文参考了网上许多优秀的资料,不能一一列举,在此一并致谢。写的是折腾这么久的一点感受,作为参考,希望以后不要犯类似的错误。如有不妥之处,欢迎指正!