Unicode

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)

原文地址:https://www.cnblogs.com/megachen/p/10087643.html