ascii,unicode,utf-x都是文字和数字的映射, 因为计算机只能存储数字.
ascii
1.早起用8位二进制来编码英文(最前面以为是0,实际只用了7位),既产生了128个元素的ascii码表.
2.但是128个只能表示英文,所以其他国家就决定把字节中最前面一位拿来使用,原来的128个元素,就编程了256个字符,也即是说最高位为1的时候,各个国际自己给后面的位(1xxxxxxx)赋予他们国家的意义.
3.这样还是有两个问题,1)各个国家的标准不一样,比如130 在法语中代表了 é,但是在希伯来语中却代表了字母 Gimel,标准不通用; 2)中文汉字128个显然不够
unicome
1.为了解决ascii编码的不足,世界各国就制定了统一的编码标准,既unicode,编码范围是0x000000到0x10FFFF,共110万个字符,每个字符都有唯一的Unicode编号.
2.unicode本身只规定了每个字符的编号是多少,并没有规定在计算机里如何存储,如何存储是utf-x来决定了.也就是说unicode是一个规范,而utf-x是这个规范的实现
utf-x
utf-x表示了unicode如何在电脑中存储,以王
为例,王
的unicode编码是738B
utf-32
以四个字节表示,不足高位补0,所以王
就在计算机中存储就为0000FEFF0000738B
或FFFE00008B730000
0000FEFF
和0000FFFE
分别代表的大小端,在读取文件时先读取此大小端的规定
utf-16
1.使用变长字节表示:
1)0x0000~0xFFFF的字符,用两个字节表示
2)0x10000~10FFFF之间的字符,用四个字节表示
2.开头使用FEFF和FFFE来表示大小端
utf-8
1.变长字节表示
1)字节第一位是0的,和ascii编码相同,使用一个字节
2)对于第一位非0的,需要多个字节来表示.假设utf-8使用了n(2=<n<=4)个字节表示字符,第一个字节的前n位都为1,第n+1位都为0,后面的字节一律设为10,将unicode编码字节按顺序填入没有规定的位置即可
3)utf-8 没有大小端
编码范围 | 二进制 |
---|---|
0x00~0x7f(0-127) | 0xxxxxxx |
0x80~0x7FF(128-2047) | 110xxxxx 10xxxxxx |
0x800~0xFFFF(2048-65535)1110xxxx 10xxxxxx 10xxxxxx
0x10000~0x10FFFF(65535以上)|1110xxx 10xxxxxx 10xxxxxx 10xxxxxx
王
的各个编码
编码类别 | 结果 |
---|---|
Unicode编码 | 738B |
UTF8编码 | E78E8B |
UTF16BE编码 | FEFF738B |
UTF16LE编码 | FFFE8B73 |
UTF32BE编码 | 0000FEFF0000738B |
UTF32LE编码 | FFFE00008B730000 |
参考:
https://blog.csdn.net/hongsong673150343/article/details/88584753
https://www.qqxiuzi.cn/bianma/Unicode-UTF.php