
二进制数表示的编码解码字符与二进制数之间的对应规则所有字符的集合,包括各国家文字、标点符号、图形符号、数字等字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码128个字符。比如:空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)
欧洲使用的语言,包括荷兰语、德语、意大利语、葡萄牙语等单字节编码,兼容ASCII编码显示中文而设计的一套字符集7000多个简体汉字双字节编码方案,共收录了21003个汉字繁体汉字以及日韩汉字等70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成任意语言的任意字符而设计,也称为统一码、标准万国码2个字节表示,一共可以表示65536个字符,附加扩展字符编码采用4个字节来表示,这样最多可以定义1048576个字符
极大的浪费区别Unicode和ASCII?计算机怎么知道两个字节表示一个符号,而不是分别表示两个符号呢?不够表示所有字符UTF-8、UTF-16和UTF-32将数字转换到程序数据的编码方案变长的编码方式UTF-8编码规则
Unicode编码(十六进制) | UTF-8 字节流(二进制) |
|---|---|
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
例如:
16位二进制数字(模板x的数量,不足16位在前面补0):0110 1100 0100 1001byte[] bytes = "汉".getBytes()的由来UTF-8解码规则

@Test
public void test() throws UnsupportedEncodingException {
byte[] bytes1 = "A".getBytes();
System.out.println(Arrays.toString(bytes1)); // [65]
byte[] bytes2 = "中".getBytes("GBK");
System.out.println(Arrays.toString(bytes2)); // [-42, -48]
byte[] bytes3 = "中".getBytes("UTF-8");
System.out.println(Arrays.toString(bytes3)); // [-28, -72, -83]
}注意: 在中文操作系统上,ANSI编码即为GBK;在英文操作系统上,ANSI编码即为ISO-8859-1