今天测试了一下字符串字节数和字符数,没想到出现意想不到的结果。 private static void lengthTest(){
//在JAVA中,一个char是2个字节(byte),而一个中文汉字是一个字符,也是2个字节
String str0="中";
String str1="中国";
String str2="1k";
String str6="LK";//全角
String str3=",。";//中文状态下的标点符号
String str4=",.";
String str5=",。";
System.out.println(str0+": "+str0.getBytes()+": "+str0.getBytes().length+": "+str0.length());
System.out.println(str1+": "+str1.getBytes()+": "+str1.getBytes().length+": "+str1.length());
System.out.println(str2+": "+str2.getBytes()+": "+str2.getBytes().length+": "+str2.length());
System.out.println(str6+": "+str6.getBytes()+": "+str6.getBytes().length+": "+str6.length());
System.out.println(str3+": "+str3.getBytes()+": "+str3.getBytes().length+": "+str3.length());
System.out.println(str4+": "+str4.getBytes()+": "+str4.getBytes().length+": "+str4.length());
System.out.println(str5+": "+str5.getBytes()+": "+str5.getBytes().length+": "+str5.length());
}运行结果:中: [B@1e63e3d: 3: 1
中国: [B@1004901: 6: 2
1k: [B@1b90b39: 2: 2
LK: [B@18fe7c3: 6: 2
,。: [B@b8df17: 6: 2
,.: [B@13e8d89: 2: 2
,。: [B@1be2d65: 6: 2
//在JAVA中,一个char是2个字节(byte),而一个中文汉字是一个字符,也是2个字节
String str0="中";
String str1="中国";
String str2="1k";
String str6="LK";//全角
String str3=",。";//中文状态下的标点符号
String str4=",.";
String str5=",。";
System.out.println(str0+": "+str0.getBytes()+": "+str0.getBytes().length+": "+str0.length());
System.out.println(str1+": "+str1.getBytes()+": "+str1.getBytes().length+": "+str1.length());
System.out.println(str2+": "+str2.getBytes()+": "+str2.getBytes().length+": "+str2.length());
System.out.println(str6+": "+str6.getBytes()+": "+str6.getBytes().length+": "+str6.length());
System.out.println(str3+": "+str3.getBytes()+": "+str3.getBytes().length+": "+str3.length());
System.out.println(str4+": "+str4.getBytes()+": "+str4.getBytes().length+": "+str4.length());
System.out.println(str5+": "+str5.getBytes()+": "+str5.getBytes().length+": "+str5.length());
}运行结果:中: [B@1e63e3d: 3: 1
中国: [B@1004901: 6: 2
1k: [B@1b90b39: 2: 2
LK: [B@18fe7c3: 6: 2
,。: [B@b8df17: 6: 2
,.: [B@13e8d89: 2: 2
,。: [B@1be2d65: 6: 2
中国: [B@1004901: 6: 2
1k: [B@1b90b39: 2: 2
LK: [B@18fe7c3: 6: 2
,。: [B@b8df17: 6: 2
,.: [B@13e8d89: 2: 2
,。: [B@1be2d65: 6: 2有错的吧?注意一下,3,6,代表3个字节和6个字节
标题起得确实有错,我所知道的是一个中文字符有2个字节或4个字节的,还是不明白为什么显示3
UTF-8 中的汉字至少是占用三个字节的
UTF-8 中的汉字咋会变成 4 个字节了?
UTF-8 是3个字节代表一个汉字的。你说的4个字节不知道是哪种编码方式。
String s="中";
print(s.getBytes()); //Windows OS中文版系统默认的gb2312编码方式:-42 -48
print(s.getBytes("UTF-16")); //-2 -1 78 45 前面的-2和-1是BOM
print(s.getBytes("UTF-8")); //-28 -72 -83
print(s.getBytes("gb2312")); //-42 -48
三字节的有效信息量是BMP(Basic Multilingual Plane),两个字节
1110yyyy
10yyyyxx
10xxxxxx