之前在进行网络编程、web开发时经常遇到文本的字符集编码问题,当时也没有深入的了解这方面知识,最近正好研究了一下这方面的东西,争取从本质上搞懂它。
在计算机中任何信息、数据都是以二进制的形式存储的,文本字符串也不例外。所有的字符构成字符集(Character Set),而最终每个字符都对应一个整数,所以说在计算机中存在一个字符集到一组整数的映射,这个映射可以称作编码字符集(Coded Character Set),例如,ASCII、Unicode、GB2312等等都是编码字符集,在ASCII中'A'被映射成整数65。
运行下面的程序可以看到字符对应的整数:
import java.util.Arrays; class CharSetTest { public static void main(String[] args) throws Exception{ String s1="Test!"; String s2="Test!"; byte[] b1=s1.getBytes(); byte[] c1=s2.getBytes(); byte[] b2=s1.getBytes("UTF-16BE"); byte[] c2=s2.getBytes("UTF-16BE"); System.out.println(s1+" 默认编码: "+Arrays.toString(b1)); System.out.println(s2+" 默认编码: "+Arrays.toString(c1)); System.out.println(s1+" UTF-16BE: "+Arrays.toString(b2)); System.out.println(s2+" UTF-16BE: "+Arrays.toString(c2)); } }
运行结果:
Test! 默认编码: [84, 101, 115, 116, 33]
Test! 默认编码: [84, 101, 115, 116, -93, -95]
Test! UTF-16BE: [0, 84, 0, 101, 0, 115, 0, 116, 0, 33]
Test! UTF-16BE: [0, 84, 0, 101, 0, 115, 0, 116, -1, 1]
可以看出中文字符!对应两个字节。在进行web开发或网络编程时,一定要使字符集一致,否则会出现乱码。尤其是进行php+mysql时,要使php文件内容的编码,php中的charset,还有mysql的数据库的编码,以及连接、查询编码一致。