String.getBytes().lenget不等于String.length的情况解决方案

String.getBytes方法所得到的Byte[]的长度不等于String.length

    • 长度不等的原因
    • 进阶使用

长度不等的原因

长度相等的情况

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

本文如有错误或者不足,请大家加以指正。

你可能感兴趣的:(java,字符串,乱码)