规则:定义一个方法,形参是一个字符串和字节数,然后根据这个字节数去截取字符串,若字符串还有中文,不能只截取中文的一半字节。比如,若字符串是“A人BC”,字节数是2,那么输出结果就是“A人”,而不是“A+人的一半字节数”。如果字节数是4,输出结果是“A人B”
1. 前置基础:
在计算机中,任意数据都是以二进制的形式来存储的
字节是计算机中最小的存储单元
存储英文,只需一个字节。
ASCII字符集 ---欧美
0-127共128个字符
ASCII编码规则:前面补0,补齐8位
ASCII解码规则:直接转换成十进制
GBK字符集 ---中国
Windows系统简体中文版默认使用GBK字符集,系统显示ANSI
GBK英文编码规则兼容ASCII编码规则,GBK字符集兼容ASCII字符集
-
GBK中文编码规则
-
规则1:汉字两个字节存储
-
规则2:高位字节二进制一定以1开头,转成十进制后是一个负数
高位字节:第一个字节 ---一定是负数
低位字节:第二个字节 ---可能是正,可能是负
Unicode字符集 ---万国码
Unicode存储规则
-
Unicode完全兼容ACSII字符集,但不包过编码规则
-
UTF-16编码规则:用2-4个字节保存
-
UTF-32编码规则:固定使用4个字节保存
-
UTF-8编码规则:用1-4个字节保存
ASCII用1个字节保存
简体中文用3个字节保存 ---第一个字节的首位一定是1
红色字体是各个字节的固定格式,x是查询Unicode字符集获取到对应数字后,需要直接填充的地方。
2.代码解析
1.gbk编码格式解决方案
public class ByteTest {
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(test("A人BC",2)); //A人
}
public static String test(String str, int num) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
byte[] gbks = str.getBytes("gbk");
int j = 0;
for (int i = 0; i < num; i++) {
if(gbks[i] >= 0){
sb.append(str.charAt(j));
}else if(gbks[i] < 0){
sb.append(str.charAt(j));
i++;
}
j++;
}
return sb.toString();
};
}
2.utf-8编码格式解决方案
public class ArrayTest {
public static void main(String[] args) {
String str = "A人BC";
byte[] bytes = str.getBytes();
int num = 4;
byte[] copyOf = Arrays.copyOf(bytes,num);
//字符串构造方法的第二个形参可指定编码格式,我默认使用的是utf-8所以不必指定。
String str2= new String(copyOf);
//因为utf-8使用的unicode编码,中文占3字节,所以此处输出结果与题目要求略有差异
System.out.println(str2);//A人
}
}