对于汉字的切分 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'));
}
}