Ascii,Unicode和utf-8的发展演变,java下字符和字节关系

出现ascii码:

开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态,此时传输英文的各种字母字符或控制码足够了.

出现GB2312和GBK

后来计算机在中国使用,大家使用中文,但是中文很多7千多个中文,都需要表示,所以将ascii码改造(即一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉,注意此时一定大于127)后产生了GB2312,此时包含7000多个简体汉字\希腊字母和数字;后来发现还是不够用,于是不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,此时产生了GBK;

出现unicode

此后出现了很多类似中国对ascii码的改造;国际组织出现了,定义了unicode,其只是一个用来映射字符和数字的标准,对支持字符的数量没有限制,也不要求字符必须占两个字节;unicode目前的规划总空间是17个平面(0-16),每个平面有65536个码点;

 

出现utf-16

为解决unicode如何在网络上传输的问题,每次传输都是以16位(2字节)为单位.

为什么在utf-8下 英文1char=1byte 中文1char=3byte

但是此时如果传输的英文则会也是传输两个字节,而实际上一个字节刚刚好,这样就浪费了50%的带宽.所以出现了下面的utf-8编码;

是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)

为什么utf-8编码时:英文 1char=1byte中文1char=3byte

首先当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,所以一个英文字符为1字节;

下面解决1中文字符对应三个字节的问题:

这是因为计算机并不知道到底是单个字节表示一个字符,还是连续多个字符一起表示一个字符;所以utf做了如下规定:

如果一个字符仅有一个字节,那么8位字节的第一位就为0

如果一个字符对应两个字节,规定第一个字节前两位都是1,然后第一个字节的第三位为0,第二个字节的前两位为10;

如果一个字符对应三个字节,规定第一个字节的前三位都是1,然后第一个字节的第四位为0,剩余两字节的前两位都是10;

有了以上规则,考虑中文字符如何用utf-8表示?

如果是两字节,此时因为第一个字节的前三位110,和第二个字节10共计占用了5位,所以真实用于表示中文的仅有11位,显然和unicode下一个字符由16位来表示相悖,所以使用三个字节来表示非ascii码.

 

有了上面的基础,回答以下问题:

 

Java中1字符等于几个字节?

Java规定:java的char是utf-16的code Unit,所以一定是16位(2字节),但是存在以下实例:

在utf-8的时候,new String(“字”).getBytes().length返回3,表示3个字节;其实应该区分内码和外码;

内码:程序内部使用的字符编码

外码:程序与外部交互时使用的字符编码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值