浅论中文乱码问题

减小字体 增大字体 作者:佚名  来源:www.zhonghualunwen.com  发布时间:2011-10-16 22:43:37

在Web应用程序开发中,中文乱码一直是一个不断困扰着开发者的大问题,原因是Web应用程序开发的复杂度较高且涉及的环节众多,而各个环节使用的编码方式可能又各有不同,在开发过程中,不管开发者忽略了其中的哪一个环节,在显示时都可能出现中文乱码。其实在此之前,和中文乱码相关的一些问题分析与解决以及现在常用的字符编码方式的介绍已经有很多人写过了,其中有的是针对乱码出现的具体现象来给出具体的处理方法,有的只是对Web应用程序开发中的某一个局部环节进行分析,我觉得这都是不够的,因为Web应用程序开发中的各个环节都是相互联系且相互影响的,所以对Web底层运行模式的整体把握是非常重要的。所以希望通过本文对Web开发中相关环节底层运行模式原理的介绍,来说明中文乱码产生的原理方面的原因。

1 字符编码介绍

字符是计算机表达信息的主要方式,字符的主体部分是美国信息交换标准码ASCⅡ(American Standard Code for Information Interchange)。现代的ASCⅡ是一个7 bit的编码标准,即ASCⅡ编码方式使用7bit来表示一个字符,总共128个字符,其中包括英文字母、数字和标点符号等常用字符。但是由于计算机通常用“byte”这个八bit的存储单位来进行信息交换,而ASCⅡ对值大于127的128个符号没有明确的规定,因此不同的计算机厂家各自对ASCⅡ进行了扩充,对值大于127的128个字符予以定义,以满足他们自己的用途,例如ISO8859-1(也称为 Latin-1,是一种单字节的编码方式)就是这样一种编码方式;ISO8859-1其低位是与ASCⅡ相兼容的,而高位用于定义常用的西欧字符。[1]

但是由于单字节的编码方式最多只能区分256个字符,这虽然对于表示英文字母而言是足够使用了,但是对于一些使用非英语的国家(例如:中国)而言,256个字符是远远不够的,所以,为了满足需要,出现了以2个byte(16 bit)来表示一个字符的Unicode编码(注意:它是不兼容ISO8859-1编码的)。Unicode编码一共可以表示65 536个字符。该字符集将几乎所有语言的常用字符收录其中,方便信息交流。但是考虑到Unicode编码不兼容ISO8859-1编码,而且容易占用更多的空间(不管任何字符都需要用两个字节表示,包括英文字母),因此产生了UTF编码(它兼容ISO8859-1编码),它也可以用来表示所有语言的字符。

另外,UTF编码是不定长编码,每一个字符的长度从1-6个字节不等。其中最为常用的是UTF-8编码。

在中国,目前使用的中文汉字编码方式主要有GB2312、GBK和Big5等。GB2312码是中华人民共和国国家标准汉字信息交换用编码,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标码。GBK编码是中国大陆制订的。它是GB2312的扩展。Big5是目前台湾、香港地区普遍使用的一种繁体汉字的编码标准。[1]

2 相关概念

在介绍Web之前,先介绍一下HTTP协议(下面只对和编码有关系的HTTP协议的信息类型的相关内容进行介绍,而和HTTP协议相关的其他内容,可以通过查阅相关文献获得,这里就不再赘述)。

HTTP协议的信息包含请求和响应两大类。所采用的是RFC822的普通信息格式,包含开始行、信息头和信息体(如图1所示)。由于HTTP协议规定,浏览器向Web服务器传递的参数信息中不能出现某些特殊字符,而必须对这些字符进行URL编码后再传出,所以我们在后面讨论中所涉及的都是经过编码的实体。[1]

3 Web应用的一般结构

Web大致分为三层,即客户端,Web服务器及数据库。客户端用户通过HTTP协议向Web服务器发送请求,Web服务器接收请求并进行相应处理之后,将信息再通过HTTP协议发送回客户端,并在浏览器上显示。如下图2所示。

3.1 客户端

客户端浏览器在传送中文字符参数(例如:带中文字符参数的FORM表单)给Web服务器之前,会先对输入的中文字符进行编码,它依据的编码方式是显示当前页面时所采用的字符编码(例如,当前页面是以GB2312的编码方式显示的,则浏览器将会把需要传送的中文字符以GB2312的方式进行编码),最后再传送给Web服务器。

3.2 Web 服务器端

Web服务器从客户端接收到的请求页面,可能是Html格式页面,也可能是JSP格式页面,这两种格式的请求,文字符的处理方式是有区别的,下面将对每一种格式的中文字符处理方法进行分析。

3.2.1 HTML处理

当服务器接收到请求信息时,则会对它进行相应的处理,这里先介绍请求信息传送的是HTML页面时服务器的处理方式。

一般在HTML网页中的<head></head>中都会设置一个<meta>标签,例如:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,<meta>标签中的http-equiv属性值用于在HTML文档中模拟HTTP消息的Content-Type头,告诉浏览器应该采用哪一种字符集编码来显示当前页面中的内容。(在例子中的设置,是要求浏览器用“GB2312”的URL编码方式来显示网页的内容)

3.2.2 JSP处理

由于JSP页面最终是要翻译

[1] [2]  下一页

Tags:中文乱码

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论