乱码问题原理分析

来源:互联网 发布:远程服务器监控软件 编辑:程序博客网 时间:2024/05/17 23:31

中文乱码问题的由来

  在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。对于我们所看到的字符,也是以二进制数据的形式存在的。不同的字符对应二进制的规则就是字符编码。字符编码的集合称为字符集。

常用的字符集简介

  ASCII字符编码集是较早出现的字符编码集合,它使用一个字节来表示256种不同的字符。ASCII字符集是如今最通用的单字节编码系统。

  ISO-8859-1(同ISO8859-1)字符编码集的诞生弥补了ASCII字符集编码数量不足以涵盖其他语言所需字符的缺点,ISO-8859-1通常也叫Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII字符集相同。

  GB2312字符编码集。是由我国发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。鉴于中文字符数量之多,故采用两个字节来表示一个字符,分别称为高位和低位。为了和ASCII码有区别,中文字符的每一个字节的最高位都用1来表示。GB2312字符集是几乎所有的中文系统和国际化软件都支持的中文字符集

  GBK字符编码集。完全兼容GB2312字符编码集,并且还对一些繁体中文,一些不常用的汉字和许多字符进行了编码。它也是现阶段Windows和其他一些中文操作系统的默认字符集,但并不是所有的国际化软件都支持该字符集,不过要注意的是GBK并不是国家标准,它只是规范。

  Unicode字符编码集。为了统一全世界的字符编码,由Unicode协会指定并发布了Unicode编码。Unicode使用0~65535的双字节无符号数对每一个字符进行编码。其中的0~255的字符与ISO-8859-1中的一致。

UTF-8字符编码集。由于采用Unicode字符编码,一个英文字符要占用两个字节,在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode编码,将会使数据量增加一倍,为了减少存储和传输英文字符数据的数据量,可以采用UTF-8编码集。对常用的字符,即0~127的ASCII码,UTF-8用一个字节来表示,这意味着只包含7位的ASCII字符的字符数据在ASCII和UTF-8两种编码方式下是一样的。

注意:在UTF-8编码的多字节串中,第一个字节开头“1”的数目就是整个串中字节的数目。

对乱码产生过程的分析

为了实现java编写的程序一次编写到处运行,java内部采用Unicode字符集编码来表示字符。因此,在java语言中,不同字符集编码的转换,都是通过Unicode作为中介来完成的.

当从Unicode编码向某个字符集转换时,如果该字符集中没有对应的编码,则得到0x3f(即?字符)。这就是为什么有时候我们输入的是中文,在输出是却变成了问号。

当从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd。例如,一个GBK的编码值0x8140,从GB2312向Unicode转换,然而由于0x8140不在GB2312的字符集的编码范围(0xa1a1-0xfefe),当然也就没有对应任何的字符,所以转换后会得到0xfffd。

 

注意:浏览器会根据本地系统默认的字符集提交数据,而web容器默认采用ISO-8859-1的编码方式解析POST数据,另外JDBC驱动程序多数也采用ISO-8859-1的编码方式,.Class字节码文件是通过UTF-8编码的。

 

原创粉丝点击