package chapter04;
/****
*
本帖最后由 kongyeeku 于 2012-3-11 23:02 编辑
看到有一些读者询问关于该题的解题思路,其实这个题是有一些很绕的地方。
大家可按如下5个步骤来思考这个问题:
1.习题要求能支持简体中文字符,所以你要考虑支持简体中文字符的字符集有哪些?
UNICODE、UTF-8、GBK、GB2312等等
2.习题要求你按字节截取,而且中文字符占2个字节,英文字符占一个字节,这种字符集有哪些?
只有有GBK或GB2312了。
3.既然题目要求按字节截取,那你是不是要把字符串先转成字节?
当然了!大家可以去查询String类的方法,看看哪个方法可以完成这个功能?
4.转成字节后,肯定得到一个字节数组——这时候你可以开始截取了。问题是如何保证不会出现半个中文字符(肯定是乱码)?
i.你可以仔细观察中文字符分解成字节后有个规律,仔细看看!找到这个规律。
ii.每个中文字符必须有2个字节。因此你要保证连续的特殊的字节数必须是偶数才行!
5.如果你做好上面4个步骤,基本上你已经接近答案了,你只要再将字节数组回复成字符串就可以了!
恢复字符串, 那当然就是要构造一个String对象啦,该查什么呢。
*/
import java.io.*;
public class SubStringInByteMyself {
/**
* @param args
*/
private static String SubByteString(String str,int from, int to)
throws UnsupportedEncodingException{
byte [] byteArr = str.getBytes("GBK");
byte [] subArr = new byte[byteArr.length];
int count = -1;//中文两个字节当成一个字符
int c=-1;
for(int i=0; i<byteArr.length; i++){
if(byteArr[i]<0 && byteArr[i+1]<0){
count++;
if(count>=from && count<=to-1){
subArr[++c] = byteArr[i];
subArr[++c] = byteArr[i+1];
}
i++;
}else if(byteArr[i]>=0){
count++;
if(count>=from && count<=to-1){
subArr[++c] = byteArr[i];
}
}
}
int length=0;
for(int i=0 ;i<subArr.length; i++){//判断输出字符的多少
if(subArr[i] != 0){
length++;
}
}
return new String(subArr,0,length,"GBK");
}
public static void main(String[] args)throws UnsupportedEncodingException {
// TODO Auto-generated method stub
String str = "中文好abc";
String str2 = "中文1种";
String str3 = "a中bc";
String str4 = "abc89def中国rrr人时候eee";
String str5 = "abcdefghijklmn";
System.out.println(SubByteString(str4, 3, 14)); // 输出:89def中国rrr人
System.out.println(str4.substring(3, 14)); // 输出:89def中国rrr人
System.out.println(SubByteString(str, 1, 3)); // 输出:文好
System.out.println(SubByteString(str2, 1, 3)); // 输出:文1
System.out.println(SubByteString(str3, 1, 3)); // 输出:中b
String str1="中国abc";
System.out.println(SubByteString(str1,1,3));
System.out.println(SubByteString(str5, 2, 4));
}
}
疯狂java讲义第四章第一题
最新推荐文章于 2021-12-27 09:14:19 发布