Unicode
unicode与UTF-8的区别
- unicode只是一个编码的标准, 它并不是具体的实现
- UTF-8对unicode编码标准的一种实现
UTF-8
- UTF-8编码在1-4字节之间, 是可变长度的
- UTF-8的规则
-
编码是从高字节到低字节的, 与一般的编程相反
-
对于2个字节的UTF-8编码
- 高字节以110开头, 11表示这个占用了2个字节, 0表示结束标记
- 低字节以10开头, 这样做是为了区分UTF-8的高字节和低字节, 在高位的时候用来判断是否是ASCII编码
- 所以可能有这样的编码: 11011011 10110211
- 上面示例中, 去掉110和10, 剩下的11011 110211才是我们需要提供的数据(码点), 调用encodeUtf8函数(如果有的话, 不同的语言有不同的库实现), 该函数会将11011 110211当做数据位构建出11011011 10110211这样的UTF-8编码, 这个过程就是encode
-
对于3个字节的UTF-8编码
- 最高字节以1110开头, 111表示这个字符占用了3个字节, 0是结束标志
- 剩余的2个低字节都以10开头, 用于区分UTF-8中的高字节和低字节
- 可能存在的编码: 11101111 10111111 10111111
- 上面示例中, 去掉110, 10, 10, 剩下的就是数据(码点)
-
对于1个字节的UTF-8编码
-
在上面个的两个例子中, 推测出来, 1个字节的情况下, UTF-8编码应该是以10开头的, 但是, 实际上, UTF-8在字符所占在1个字节以上才有意义, 所有在一个字节的时候UTF-8其实是采用了ASCII的编码方式, 下面提一下ASCII
-
ASCII编码
- 因为ASCII只支持英文, 英文字符有很少, 加上一些控制字符, 总共127个字符, 我们只需要7位就可以存储, 但是在计算机上一般是以byte为单位的, 也就是8位, 所以为了兼容这种情况, 一个ASCII的'a'是由8位存放的, 最高位是多余的, 值为0
- 因此一个ASCII的字符, 可能是0111111
-
在给了一个已经用UTF-8编码的数据, 如果高字节以0开头, 则断定是1个字节, 并且采用的是ASCII编码(体现了UTF-8兼容ASCII)
-
-