String~char~Unicode~UTF-8

先po一段代码

        String tmp=new String("abcd");
        byte[] tmpBytes=tmp.getBytes();
        String chineseStr=new String("a一二");
        byte[] chiBytes=chineseStr.getBytes();

//tmp variables
这里写图片描述
上图展示的是tmp的详细信息。以我们熟悉的ascii码来存储。此处不赘述。

//chineseStr variables
这里写图片描述
此处有若干问题:

  1. chineseStr内容有英文有中文,两者需要的存储空间是不同的,分别是多少
  2. value中的19968和20108分别来自哪儿
  3. 上一问题中的俩数字是怎么转换成chiBytes中数值的

现在一一来回答。

  1. 英文依旧用ascii码来存储,只需要一个byte就能存储,所以chiBytes[0]==97。而中文字符则需要三个bytes来存储。
  2. 我们可以在网上查找中文字符对应的unicode码。在工具类网站上查到,”一”对应的unicode码是 “\u4e00”,而0x4e00=19968。同样,“二”的unicode码是 “\u4e8c”,而0x4e8c=20108。所以第二个问题答案就是这些中文字符的unicode码。
  3. 根据此处提供的信息:通常汉字用 UTF-8 表示时是三个字节,格式为「1110XXXX 10XXXXXX 10XXXXXX」。0x4e00=0100111000000000b,将其插入空缺位得,11100100 10111000 10000000。所需的空间正好是3bytes,再每个byte内容以十进制表示,分别是-28 -72 -128。正对应chiBytes[1]、chiBytes[2]、chiBytes[3]。对0x4e8c做类似处理将获得同样结果。

Unicode和UTF-8的关系。一言以蔽之,Unicode是字符集,UTF-8是编码方式。

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx (文中出现的是此种方式)
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值