一说到编码,就会想到ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16这些,那么这些都是表示什么意思呢?相互间有什么关系呢?
参考https://www.cnblogs.com/throwable/p/9188439.html
ASCII
全称是American Standard Code for Information Interchange,中文翻译为美国标准信息交换码。
ASCII是单字节编码系统。标准ASCII使用7位二进制数来表示所有的大写字母、小写字母、数字0-9及英文标点符号等。
27=128,所以ASCII只能表示128个字符。大写字母从十进制值65开始,往后查26个数。小写字母从十进制值97开始,往后查26个数。数字0-9从十进制值48开始,往后查10个数。ASCII不支持中文。
示例:
public static void main(String[] args) throws Exception { String value = "CO2"; byte[] bytes = value.getBytes("ASCII"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "ASCII")); }
String的getBytes方法把一个字符串转成字节数组,底层实际上是把字符串对应的字符数组转成字节数组。
ISO-8859-1
ISO-8859-1也是单字节编码系统。比ASCII好一点,ISO-9959-1编码范围是[0-255],其中[0-127]和ASCII一样。也就是说ISO-8859-1是向下兼容ASCII的。ISO-8859-1也不支持中文。
public static void main(String[] args) throws Exception { String value = "CO2"; byte[] bytes = value.getBytes("ISO-8859-1"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "ASCII")); }
GB2312
GB代表国标,2312是国标序号。这个是中国自己搞出来的编码集。除了收录了数字、大小写英文字母外,主要是收录了6763个汉字。可以满足大部分中文场景下的日常需要。但是要知道,汉字何止仅6763个,如朱镕基总理的镕字就没有收录进去。
public static void main(String[] args) throws Exception { String value = "海贼王"; byte[] bytes = value.getBytes("GB2312"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "GB2312")); }
GBK
GBK是国标扩展,在GB2312的基础上,总共收录了2w多的汉字。
public static void main(String[] args) throws Exception { String value = "朱镕基"; byte[] bytes = value.getBytes("GBK"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "GBK")); }
unicode
unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。unicode是两字节编码,采用两个字节编码一个字符。216=65536,所以unicode最多可以编码65536个字符。但是汉字简体加繁体有六七万个,而unicode也就只收录了7000多个汉字,所以单就对中文的支持来说,unicode是比不上GBK的。
public static void main(String[] args) throws Exception { String value = "朱镕基"; byte[] bytes = value.getBytes("unicode"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "unicode")); }
UTF-8
UTF-8,全称是8-bit Unicode Transformation Format,是可变长的unicode。如上面所说,unicode是定长的,采用2字节编码,所以unocode也称为UTF-16。在处理ISO-8859-1范围的字符时,用2个字节有点浪费,所以就出现了UTF-8。UTF-8使用1-4个字节编码字符。
public static void main(String[] args) throws Exception { String value = "朱镕基"; byte[] bytes = value.getBytes("UTF-8"); System.out.println(Arrays.toString(bytes)); System.out.println(new String(bytes, "UTF-8")); }
乱码
如果只是处理英文及数字字符串,永远不会乱码。乱码肯定是处理其他字符时产生的。