根据传入的字符串和字节数进行字符串的截取---Java

规则:定义一个方法,形参是一个字符串和字节数,然后根据这个字节数去截取字符串,若字符串还有中文,不能只截取中文的一半字节。比如,若字符串是“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人  
       
    }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值