• 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)

  • 相关阅读:
    prepareStatement的用法和解释
    java socket报文通信(一) socket的建立
    java多线程小结
    Java_XML操作
    socket实例2
    socket实例1
    Socket小结
    从源码角度理解android动画Interpolator类的使用
    android使用属性动画代替补间动画
    OKHttp的简单使用
  • 原文地址:https://www.cnblogs.com/megachen/p/10087643.html
Copyright © 2020-2023  润新知