Java 中文乱码问题产生原因分析
在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。对于我们所看到的 字符,也是以二进制数据的形式存在的。不同字符对应二进制数的规则,就是字符的编码。字符编码的集 合称为字符集。
17.1.1
常用字符集
在早期的计算机系统中,使用的字符非常少,这些字符包括 26 个英文字母、数字符号和一些常用符 号(包括控制符号) ,对这些字符进行编码,用 1 个字节就足够了(1 个字节可以表示 28=256 种字符) 。然 而实际上,表示这些字符,只使用了 1 个字节的 7 位,这就是 ASCII 编码。
1.ASCII ASCII(American Standard Code for Information Interchange,美国信息互换标准代码) ,是基于常用的 英文字符的一套电脑编码系统。每一个 ASCII 码与一个 8 位(bit)二进制数对应。其最高位是 0,相应的 十进制数是 0~127。例如,数字字符“0”的编码用十进制数表示就是 48。另有 128 个扩展的 ASCII 码, 最高位都是 1,由一些图形和画线符号组成。ASCII 是现今最通用的单字节编码系统。 ASCII 用一个字节来表示字符,最多能够表示 256 种字符。随着计算机的普及,许多国家都将本地的 语言符号引入到
计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。 2.ISO8859-1 因为 ASCII 码中缺少£、ü 和许多书写其他语言所需的字符,为此,可以通过指定 128 以后的字符来 扩展 ASCII 码。国际标准组织(ISO)定义了几个不同的字符集,它们是在 ASCII 码基础上增加了其他语 言和地区需要的字符。其中最
常用的是 ISO8859-1,通常叫做 Latin-1。Latin-1 包括了书写所有西方欧洲语 言不可缺少的附加字符,其中 0~127 的字符与 ASCII 码相同。ISO 8859 另外定义了 14 个适用于不同文字 的字符集(8859-2 到 8859-15) 。这些字符集共享 0~127 的 ASCII 码,只是每个字符集都包含了 128~255 的其他字符。 3.GB2312 和 GBK GB2312 是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本 集》 ,标准号为 GB2312-80,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于 中国大陆和新加坡,简称国标码。 因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。为了和 ASCII 码 有所区别,中文字符的每一个字节的最高位都用 1 来表示。GB2312 字符集是几乎所有的中文系统和国际 化的软件都支持的中文字符集,也是最基本的中文字符集。它包含了大部分常用的一、二级汉字和 9 区的 符号,其编码范围是高位 0xa1-0xfe,低位也是 0xa1-0xfe,汉字从 0xb0a1
开始,结束于 0xf 7fe。 为了对更多的字符和符号进行编码,由前电子部科技质量司和国家技术监督局标准化司于 1995 年 12 月颁布了 GBK (K 是 “扩展” 的汉语拼音第一个字母) 编码规范, 在新的编码系统里, 除了完全兼容 GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。它也是现阶段 Windows 和其他一些中文操 作系统的默认字符集,但并不是所有的国际化
软件都支持该字符集。不过要注意的是 GBK 不是国家标准, 它只是规范。GBK 字符集包含了 20 902 个汉字,其编码范围是 0x8140-0xfefe。 每个国家(或区域)都规定了计算机信息交换用的字符编码集,这就造成了交流上的困难。想像一下, 你发送一封中文邮件给一位远在西班牙的朋友,当邮件通过
网络发送出去的时候,你所书写的中文字符会 按照本地的字符集 GBK 转换为二进制编码数据,然后发送出去。当你的朋友接收到邮件(二进制数据) 后,查看信件时,会按照他所用
系统的字符集,将二进制编码数据解码为字符,然而由于两种字符集之间 编码的规则不同,导致转换出现乱码。这是因为,在不同的字符集之