二进制数
表示的编码
解码
字符
与二进制
数之间的对应规则
所有字符的集合
,包括各国家文字、标点符号、图形符号、数字等字符编码
,对英语字符
与二进制位
之间的关系,做了统一规定。这被称为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