主页

编码

2020-03-12
其他

  • Unicode是一个符号集,只规定了符号的二进制代码,如U+0041表示英语大写字母AU+4E25表示汉字
  • Unicode没有规定二进制代码如何去存储。如的Unicode是16进制4E25,转化为二进制就是101 1110 0010 0101(共15位),如果存储的话这个符号至少需要两个字节;而A的Unicode是16进制0041,转化成二进制是100 0001(7位),如果存储的话这个符号至少需要一个字节。
  • 计算机不知道到底是两个字节表示一个符号还是一个字节表示一个符号。如果统一用2个字节存储,会导致浪费,因为英文字母前面就会有一个字节的0。

  • UTF-8规定了二进制代码的存储方式,它可以使用1~4个字节表示一个字符:
Unicode(HEX) UTF-8(BIN)
0000~007F 0XXXXXXX
0080~07FF 110XXXXX 10XXXXXX
0800~FFFF 1110XXXX 10XXXXXX 10XXXXXX
10000~10FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
  • Unicode二进制位数在0~7位之间,UTF-8用一个字节表示,字节的第一位设为0;然后把Unicode的二进制从后向前填入到UTF-8的X里边去(填到UTF-8中也是按照从后向前的顺序,如果填完了发现还有X,就补零)。如A的Unicode是0041,用UTF-8表示就是0100 0001

  • Unicode二进制位数在8~11位之间,UTF-8用两个字节表示,第一个字节的前三位设为110;第二个字节前两位设置为10,然后把Unicode的二进制从后向前填入到UTF-8的X里边去(填到UTF-8中也是按照从后向前的顺序,如果填完了发现还有X,就补零)。

  • 12位及以上也是这个逻辑。


  • UTF-8编码中如果一个字节是以0开头,就表示接下来的一个字节表示一个字符;
  • 如果一个字节是以110开头,表示接下来的两个字节表示一个字符;
  • 如果一个字节是以1110开头,就表示接下来的三个字节表示一个字符;
  • 如果一个字节是以11110开头,就表示接下来的四个字节表示一个字符;
  • 如果一个字符是以10开头,说明你看错了,你得往前找一个或几个字节。

参考链接: 阮一峰的网络日志