本文简略讲解这几个编码的关系,
1、ASCII (American Standard Code for Information Interchange):美国信息交换标准代码,
主要应用于英文的编码,每个英文占用一个字节,存储到文件中。
2、gbk,兼容英文编码的情况下,可用于中文编码,其中,英文单词占用一个字节,中文字占用两个字节,存储到文件中。
3、unicode码,也叫万国码、单一码,由于各个国家的文字不同,它为每种语言中的每个字符设定了统一并且唯一的值。长度很长,例如英文字母“A”的unicode码值为65,中文“智”的unicode码值为26234,如果用同样长度的字节保存,那么对于英文字母来说就是浪费了空间,所以此时出现了utf-8,针对Unicode的一种可变长度字符编码。
4、utf-8,可变长度字符编码。对于英文来说,只需要使用一个字节代表,对于中文来说,需要三字自己代码,那么我们怎么知道utf-8编码格式下的字节是一个一组还是三个一组?这就需要用到utf-8的定义方式。
UTF-8,采用1-4个字符进行传输和存储数据。
编码规则:使用下面的模板进行转换
Unicode符号范围(十六进制) | UTF-8编码方式(二进制)
------------------------------------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如上图:
如果是英文,那么他占用一个字节,字节的二进制起始位为0,一个字节
如果是中文,那么它占用三个字节,字节的二进制起始位为1110,三个字节
下面举例说明utf-8怎么表示中文的,
char aChar = '智'; System.out.println(aChar); int index = (int)aChar; System.out.println("unicode十进制:"+index); String hexString = HexUtil.toHex(index); System.out.println("unicode十六进制:"+hexString);
通过以上代码,我们知道中文“智”的unicode码是26234,那么他的通过utf-8三个字节表示,是什么呢?使用如下代码
for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); System.out.println(getBinaryString(bytes[i])); System.out.println("-----------------"); }
得到这三个字节的值为 -26,-103,-70,
他们的补码分别是11100110,10011001,10111010
对应上述 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx
也就是utf-8代表的xxxx中的值为0110 011001 111010,使用二进制,转换,正好是26234
所以,utf-8的编码格式是这样得到的, 通过规定的byte数组得到二进制数,对比unicode码表,得到中文名称。