计算机存储文字码的底层实现和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年出的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值