java 截取汉字字符串

 

对于汉字的切分 1个 汉字 占用2个字符 不能切出半个字符 

 

 

public class StringSplit {

    public static String split(String s, int n) {
        int d = n, i = 0;
        while (i < s.length() && (d > 1 || d == 1 && s.charAt(i) < 256)) { 
            //判断是否为中文了,因为UINICODE规定,字母数组前8位为0,所以不可能大于256
            if (s.charAt(i) < 256)  
                d--;
            else 
                d -= 2;
            i++;
        }
        return s.substring(0, i);
    }
    
    public static String split2(String s, int n) {
        int count = 0;
        for(int i = 0; i < s.length() && n>0; i++){      //遍历String
            if(Character.getNumericValue(s.charAt(i))>0) //如果是中文,中文/英文标点,会返回-1
                n--;   //是英文,消去一个字节
            else 
                n-=2;  //是中文,消去二个字节
            //每消去一次,代表要截取的char多了一个
            //如果n<0也就是在最后只有一个字节可以消的时候,来了个中文:最后剩下1的时候又减去了2。如此就不要截取
            if(n>=0)   
                count +=1;
        }
        return s.substring(0, count);
    }
 
    public static void main(String[] args) {
        System.out.println(split("我A汉BC字D", 1));
        System.out.println(split("我A汉BC字D", 2));
        System.out.println(split("我A汉BC字D", 3));
        System.out.println(split("我A汉BC字D", 4));
        System.out.println(split("我A汉BC字D", 5));
        System.out.println(split("我A汉BC字D", 12));
        System.out.println(split("日产计划于2013洛杉矶车展发布一款Juke的最高性能版本车型,名为Juke NISMO RS。这款车将很快投放市场", 35));
        System.out.println("---------------------------------");
        System.err.println(split2("我A汉BC字D", 1));
        System.err.println(split2("我A汉BC字D", 2));
        System.err.println(split2("我A汉BC字D", 3));
        System.err.println(split2("我A汉BC字D", 4));
        System.err.println(split2("我A汉BC字D", 5));
        System.err.println(split2("我A汉BC字D", 12));
        System.err.println(split2("日产计划于2013洛杉矶车展发布一款Juke的最高性能版本车型,名为Juke NISMO RS。这款车将很快投放市场", 35));
 
 
        //上述做法原理
        //String转为byte[]后,按二进制位数来确定,8位为一个byte,而中文等一个字为16位
        System.out.println("你好aa".getBytes().length); //6
        //String的长度为字符数,而不论是8还是16位二进制
        System.out.println("你好aa".length());  //4
        //这个函数是按照String的长度来进行定位的
        System.out.println("你好aa".charAt(0));
        System.out.println("你好aa".charAt(1));
        System.out.println("你好aa".charAt(2));
        System.out.println("你好aa".charAt(3));
        //中文字符转换为int值时,为-1,而标点不论中英文都为-1
        System.out.println(Character.getNumericValue('a'));
        System.out.println(Character.getNumericValue('1'));
        System.out.println(Character.getNumericValue(','));
        System.out.println(Character.getNumericValue('你'));
        System.out.println(Character.getNumericValue('好'));
        System.out.println(Character.getNumericValue(','));
        //除去所有标点与数字,中文也是字母
        System.out.println(Character.isLetter('你'));
        System.out.println(Character.isLetter('1'));
        System.out.println(Character.isLetter(','));
        System.out.println(Character.isLetter('。'));
        System.out.println(Character.isLetter('a'));
        
        
 
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值