在工作中,有时会遇到一些字符编码上的问题,一旦文件的编码格式与源文件的编码格式不一致,代码中的一些字符(大多数情况下是中文)就很有可能会出现乱码现象。当时,自己经验不足的时候,要解决这类问题,也常常会让自己耗费不少的时间,现在,根据一些资料来作出一些整理,以便日后的工作中可以更有效率地解决重复问题。
一 常用的字符编码
首先介绍一下计算机中一些主流常见的编码。
1.1 GBK & GB2312 (中文)
-
GB2312
它是一个简体中文字符集,由 6763 个常用汉字和 682 个全角(指一个字符占用两个标准字符位置的状态)的汉字字符组成。
GB2312 编码使用两个字节(8位2进制)表示一个汉字,理论上最多可以表示 256 * 256 = 65536 个汉字。这个编码仅在中国可以正常使用,如果是其它国家的网友访问你使用 GB2312 编码的网站,就会出现乱码显示,因为他们的浏览器并不是使用 GB2312 编码格式。 -
GBK
GBK 主要是为了解决 GB2312 不能表示的生僻字而出现的。
1.2 Unicode(UTF-8 & UTF-16 & UTF-32)
Unicode 编码也称为万国码,它是计算机科学领域的一项业界标准。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 比 ANSI 好用。现在 WIN 的系统内核开始完全支持并完全应用 Unicode 编写,所有 ANSI 字符在进入底层之前,都会被 API 转换成 Unicode。基于此,所以你一开始就是用 Unicode 编码就可以减少转换的用时和 RAM 开销。
另外在语言中 JAVA / .NET 内置的字符串所使用的字符集已经完全是 Unicode。最重要的是,现在世界上大多数程序用的字符集都是 Unicode。
不过 Java 中 Unicode 使用 16 进制编码(可以使用 UTF-8 解决),编码太庞大会造成网络传输的负担。
1.3 ISO8859-1
ISO8859-1 是国际通用编码,一般只有字母就使用此编码格式。它是单字节编码,向下兼容 ASCII,其编码范围是0x00-0xFF。
二 乱码出现的分析
可以使用下面这段代码,查看系统的属性列表:
public class Test{
publicstaticvoid main(String[] args){
System.getProperties().list(System.out);
}
}
运行此代码,结果如下(截取部分内容):
… …
同时,应该需要注意这个属性:
需要明白乱码出现的本质:其实就是编码格式和解码格式不一致造成的。