• 计算机存储文字码的底层实现和JAVA选择UTF-16存储char的原因


    ASCII码

    每一个字节存储一个ASCII码,一个字节为8位,于是一个字节能代表128个字符,也就是常见的ASCII码 

    python基础值ascii码表总结_铁锤2号的博客-CSDN博客_python,字符的ascii

    每一个字节存储一个ASCII码,一个字节为8位,于是一个字节能代表128个字符,也就是常见的ASCII码 

    UTF-32

    每个字符用32位即4字节表示,但是要浪费大量的空间

    UTF-16

    谣传:每个字符用16位即2字节表示,还是要浪费大量的空间

    其实UTF-16是变长的

    UTF-16编码方式源于UCS-2(Universal Character Set coded in 2 octets、2-byte Universal Character Set)。而UCS-2,是早期遗留下来的历史产物。

    UTF-16兼容UCS-2,UCS-2是定长的

    UCS-2

    其编码固定占用2个字节

    UTF-8

    依照这个思路,每个字符用8位即1字节表示,那就错了

    UTF-8是可变长的,占1到6个字节都是可能的

    1.如果第一个字节的第一位为0,那么就代表占一个字节

    0XXXXXXX

    (剩下的X为记录的内容信息)

    2.如果第一个字节的前三位为110,第二个字节的前两位为10,那么代表总共占了两个字节

    110XXXXX 10XXXXXX

    3.如果第一个字节的前三位为110,第二和第三个字节的前两位为10,那么代表总共占了三个字节

    1110XXXX 10XXXXXX 10XXXXXX

    4.同理占了四个字节就为

    11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

    5.最大到六个字节

    1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX

    对于UTF-8编码的任意字节

    第一位可以判断是否为ASCII字符

    第二位可以判断该字节是否为一个字符编码的第一个字节

    如果前两位均为1,可以确定该字节为字符编码的第一个字节

    扩展:为什么JVM选择用UTF-16而非UTF-8

    注意这里说的是早期的UTF-16版本,也就是是UCS-2,它是定长的,并不现在真正意义上的utf-16

    在jvm规范中明确说明了java的char类型使用的编码方案是UTF-16

    UTF-16固定长度,而UTF-8需要根据存储信息去判断长度,如果要搜索指定位置的char,比如说要检索出第20个字符,UTF-16直接就能算出字符内存位置,而对于UTF-8由于是变长,要判断每一个字符的长度,大大降低了效率

    UTF-8时间效率不如UTF-16,所以采用了UTF-16方案

    这大概是当时设计者为了平衡运行时的时间效率(采用定长编码的UTF-16)与外部存储的空间效率(采用变长的UTF-8编码)而做的取舍

    不过呢,还得从时间上考虑,Java是1995年出的,UTF-8是2003年出的

  • 相关阅读:
    Pycharm/Dataspell中使用jupyter导入ros humble包
    win11怎么关闭触控板?win11关闭触控板的三种解决方法
    docker去掉sudo权限方法
    Springboot——集成jodconverter做文档转换
    spark-RDD的两大方法
    直线模组怎么搭配电机?
    offline 2 online | AWAC:基于 AWR 的 policy update + online 补充数据集
    10_ue4进阶_添加倒地和施法动作
    三维图形程序员必学-CGAL几何算法
    mac DOSBox快捷键
  • 原文地址:https://blog.csdn.net/qq_36653924/article/details/127701116