疯狂java讲义第四章第一题

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));
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值