浅析乱码的产生原因及消除技术

2014-07-14 02:21余江平王伟
中国科技纵横 2014年6期
关键词:字符集乱码

余江平+王伟

【摘 要】 用户在浏览网页和进行协议分析的过程中,经常会遇到出现乱码的情况,乱码问题阻碍了正常工作。本文首先阐述了字符集和字符编码的基本原理,接下来介绍了审计系统里面协议分析、报表生成等行为中乱码产生的原因,接下来介绍了消除乱码的办法。

【关键词】 字符编码 字符集 审计系统 乱码

1 引言

计算机中数据信息可分为数值和非数值信息。非数值信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理。我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将各种字符集文字存储在计算机中,如'a'用什么表示,“你好”用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如果使用了错误的解码规则,则可能导致乱码。

2 字符集和字符编码

2.1 概念

首先介绍相关概念。字符,即抽象意义上的一个符号。例如'1', '我', 'a', ‘%,'$', '¥', 。。。。字节,即计算机中的数据的存储单元,是一个8位的二进制数。 例如0x01, 0x12,。。。。字符集,即多个字符的集合,而这些字符可能是各国家文字、标点符号、图形符号、数字等。字符编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节什么形式来存储。

编码(encoding)和字符集不同。字符集只是字符的集合,不一定适合作网络传送、处理,有时须经编码(encode)后才能应用如Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式编码。

2.2 常见的字符集合对应字符编码

常见字符集名称:ASCII字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

2.2.1 ASCII字符集与ASCII编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)它主要用于显示现代英语,它是现今最通用的单字节编码系统。

ASCII编码:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符为了表示更多的常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符 详细可以查询ASCII字符代码表,其缺点是只能显示现代英语单字节字符,一个字节(8位)存放一个字符。

2.2.2 GB2312等字符集和ANSI编码

为使计算机支持更多语言,通常使用0x800~xFF范围的2个字节来表示1个字符。比如汉字'中'在中文OS中,使用[0xD6,0xD0]这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。在简体中文系统下,ANSI 编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。

2.2.3 UNICODE字符集和utf-8 utf-16UTF-32编码

计算机存放字符串时,改为存放每个字符在UNICODE字符集中的序号。目前计算机一般使用2个字节(16位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。例如"中文123"占五个序号,10个字节

我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了。

另一个更加严重的问题是,C语言使用'\0'作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,所以就产生了UTF,UTF= UCS Transformation Format,即UCS转换(传输)格式。它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16,都是Unicode的编码实现。

UTF-8兼容ASCII。UTF-8是变长的,将Unicode编码为00000000-0000007F的字符,用单个字节来表示;00000080-000007FF的字符用两个字节表示;00000800-0000FFFF的字符用3字节表示,Utf-16不兼容ASCII。

3 产生乱码的可能原因以及解决方法

(1)取文本文件时,如果将“字节串”简单地作为单字节字符串,采用每“一个字节”就是“一个字符”的方法进行转化 那可能就会出现乱码。

解决方法:应该将“字节串”作为ANSI字符串,采用适当的编码来得到UNICODE字符串,有可能“多个字节”才能得到“一个字符”。

(2)协议分析过程中,例如http中与字符集和字符编码相关的消息头是Accept-Charset:浏览器申明自己接收的字符集和字符编码如gb2312,utf-8。Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type:text/html;charset='gb2312',所以是根据这两个进行编码转换的。

(3)抓取数据包时候可能遇到的编码。URL编码:URL编码遵循每对name/value,由&;符分每对来自表单的name/value由=符分开任何特殊的字符。Base64编码:Base64是网络上最常见的用于传输8Bit字节编码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息,在Xml格式文件明显有使用到。

4 结语

本文阐述了字符集和字符编码的基本原理,介绍了审计系统里面协议分析、报表生成等行为中乱码产生的原因,介绍了消除乱码的办法。

参考文献:

[1]徐新华.字符编码详解. http://polaris.blog.51cto.com/1146394/377468

[2]吴秦.字符集和字符编码. http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

[3]字符,字节和编码. http://www.regexlab.com/zh/encoding.htmendprint

猜你喜欢
字符集乱码
ORACLE字符集问题的分析
ORACLE数据库字符集问题及解决方法
医院信息系统Oracle数据库中导入数据中文乱码的解决技术
.Net框架联合Oracle字符集问题研究
炫迈:用神奇乱码勾引你视线
如何解决Tomcat的乱码
PHP与MySQL Web应用平台中文乱码问题研究
jsp中文编码乱码的分析与解决