长度不等的原因
长度相等的情况
String str="abcdefg";
byte[] bytes = str.getBytes();
System.out.println("str.length:"+str.length());
System.out.println("bytes.length:"+bytes.length);
结果:
str.length:7
bytes.length:7
长度不相等的情况
String str="你好 \"world\"";
byte[] bytes = str.getBytes();
System.out.println("str.length:"+str.length());
System.out.println("bytes.length:"+bytes.length);
结果:
str.length:10
bytes.length:14
造成不相等的原因:
中文字符:一个中文字符的长度>=1个Byte;
Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,
采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;
采用GB2312或GBK编码方式时,一个中文字符占2个字节;
而采用UTF-8编码方式时,一个中文字符会占3个字节。
补充:转义字符 \ 不会影响length的值
进阶使用
有时我们会使用String的构造函数来截取字符串的一部分
String(byte[] bytes, int offset, int length)
//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
用法示例:
String str="abcdefg!";
System.out.println("str:"+str);
str=new String(str.getBytes(),0,str.length()-1);
System.out.println("str:"+str);
结果:
str:abcdefg!
str:abcdefg
字符串中如果带中文,str.length()-1作为参数就达不到你想要的结果
错误示例:
String str="你好!";
System.out.println("str:"+str);
System.out.println("str.length:"+str.length());
str=new String(str.getBytes(),0,str.length()-1);
System.out.println("str:"+str);
System.out.println("str.length:"+str.length());
结果:
str:你好!
str.length:3
str:�
str.length:1
因为一个中文字符占多个Byte,如果只截取到一个Byte就会出现乱码“�”
正确示例:
String str="你好!";
System.out.println("str:"+str);
System.out.println("str.length:"+str.length());
//这里参数变化了
str=new String(str.getBytes(),0,str.getBytes().length-3);
System.out.println("str:"+str);
System.out.println("str.length:"+str.length());
结果:
str:你好!
str.length:3
str:你好
str.length:2
变化的参数分析:str.getBytes().length-3
我的字符串:“你好!“是纯中文,!是中文输入法打上去的
我的编码格式是:UTF-8(该编码格式下一个中文的长度=3个Byte)
所以:str.getBytes().length=9
为了删除一个中文的“!”我必须删去3个Byte
所以是:str.getBytes().length-3
本文如有错误或者不足,请大家加以指正。