为了账号安全,请及时绑定邮箱和手机立即绑定

UTF-16编码问题

UTF-16编码问题

繁星淼淼 2019-03-28 18:15:25
        String str1="a";        String str2="b";        String str3="c";        String str4="abc";        System.out.println(str1.getBytes("UTF-16").length);//4        System.out.println(str2.getBytes("UTF-16").length);//4        System.out.println(str3.getBytes("UTF-16").length);//4        System.out.println(str4.getBytes("UTF-16").length);//8        System.out.println(str1.getBytes("UTF-8").length);//1        System.out.println(str2.getBytes("UTF-8").length);//1        System.out.println(str3.getBytes("UTF-8").length);//1        System.out.println(str4.getBytes("UTF-8").length);//3        System.out.println(str1.getBytes("UTF-32").length);//4        System.out.println(str2.getBytes("UTF-32").length);//4        System.out.println(str3.getBytes("UTF-32").length);//4        System.out.println(str4.getBytes("UTF-32").length);//12Unicde编码中不明白的,像UTF-8/UTF-32中str4编码后字节数都是str1+str2+str3,但UTF-16则不然,UTF-16到底是如何编码的呢?求赐教。
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

UTF-16是可变长度的,最少为两个字节的编码格式。因为是两个字节,就牵扯到Big Endian和Small Endian。你上面的例子因为没有指定endianess,所以加上两个字节的BOM。再加上原来字符(ASCII)编码的两个字节,所以是4个字节。如果用utf-16-le或者utf-16-be,就会是两个字节。具体Java如何表示请自查。


查看完整回答
反对 回复 2019-04-19
?
慕斯王

TA贡献1864条经验 获得超2个赞

UTF-16解码后


feff0061 //a

feff0062 //b

feff0063 //c

feff006100620063 //abc

开头都有feff,其用来表示该字符串是大端(高位字节放前面),之所以有这个标示是因为系统中存在大端和小端(高位字节在后面)两种模式,大端中0x01 0x02读取为0x0102,而同样的值在小端下读取值则为0x0201,不同,所以需要在feff来标示。


查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信