1.ASCII字符编码
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统。
- 出现原因:用7 位二进制数(机器语言)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 。总共有128个字符,用1个字节就可以保存所有ASCII码,且一个英文字符大小为1字节。
- 局限:只能显示英文字符
- 0~31和127是控制字符或通信专用字符;(不在屏幕上显示的字符)
- 32~126是字符(32是空格),其中48~57为0到9十个阿拉伯数字。(在屏幕上显示的字符)
- ASCII编码表链接:ASCII码中文站
2.Unicode字符编码
Unicode(统一码)(缩写UCS)是一种在计算机上使用的字符编码。将每种语言中的每个字符设定了统一并且唯一的二进制编码。
- 出现原因:在英语中,用128个符号编码便可以表示所有,但是用来表示其它国家语言,128个符号是不够的,所以为了能让计算机识别并表示世界上每个字符,所以创造出Unicode字符编码。
- 优点:将世界上每个符号映射为对应唯一的Unicode编号,且兼容ASCII字符编码 。
- 缺点:一个英文字母符号和一个中文符号都占用2字节空间大小(二进制数),在英文字母中,其只需1个字节就可以,使用2个字节就造成了存储空间的浪费。
- 图示:
3.UTF-8字符编码
**UTF是“UCS Transformation Format”的缩写,即Unicode字符集转换格式,
UTF-8 是 Unicode 的改进方式之一。
-
出现原因:为解决Unicode字符编码中空间浪费问题;
-
优点:继承了Unicode字符编码的优点,也能表示世界上每个符号,且不会乱码,并采用可变长的编码方式,使用1-4个字节来表示对应的二进制编码,其英文字母字符占1个字节,中文字符占3个字节,这样可以节省文本空间资源;
-
UTF-8字符编码规则:
-
- 字符对应的Unicode编号(十六进制数表示)在图中找寻对应的Unicode编号(十六进制数表示)范围,然后得到对应的UTF-8 二进制格式;
-
- 剩下空缺x二进制位,从字节最后一个的二进制位开始,将该符号的 Unicode编号(二进制数表示)按照低位填字节中的低位并依次从低位往高位填入字节空缺部分,未填完的字节空缺部分补0;
-
- 得到对应字符的UTF-8码。
-
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 |
UTF-8 二进制格式的由来:
1. 单字节UTF-8 二进制格式:
-
- 设最左位高位为0,后7位为对应的Unicode编号(二进制数表示);
-
- 得到对应字符的UTF-8格式。
由此可见,UTF-8字符编码也兼容ASCII字符编码 ,并大小为1字节,比Unicode字符编码节省1字节空间大小。
2. n字节(n>1)UTF-8 二进制格式:
-
- 第一个字节的前n位全都设为1,第n + 1位设为0;
-
- 剩余其它每个字节的前两位全都设为10;
-
- 剩余空缺填上x。
-
- 得到对应字符的UTF-8格式。
为什么可以在Java字符io流可以用char数据类型(2字节)变量存储电脑文本(utf-8编码)的汉字(3个字节)?
答案:汉字在Unicode占2字节,在utf-8中占3字节(从上图可以看出来,第一个字节的1110和第二个字节的10,第三个字节的10,加起来一个字节用来定义了格式,其实汉字有效的数据大小还是2个字节),所以在char(2个字节)中其实存储的还是汉字有效的数据大小(2个字节)。
如有错误或侵权,望您联系我进行修改,谢谢!