按照字节数截取一个字符串,“abc你好” 如果截取到半个中文,舍弃,比如 截取4个字节 abc。截取 5个字节abc你

时间:2023-01-12 08:30:32
import java.io.IOException;
import java.io.UnsupportedEncodingException;


public class Test {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
	/*
	 *  按照字节数截取一个字符串,“abc你好” 如果截取到半个中文,舍弃,比如 截取4个字节 abc。截取  5个字节abc你
	 *  定义功能实现
	 *  字符串-->字节数组  编码
	 *  字节数组-->字符串。 解码。
	 *   GBK2312编码的一个中文是两个字节,而且两个字节的最高位都是1,也就是说是一个负数 
	 *  思路:
	 *    1, 中文两个字节都是负数
	 *    2,判断截取的最后一个字节是否是负数
	 *     如果不是,直接截取
	 *      如果是,就往回判断前一个是否是负数,并记录负数的个数,如果连续的负数有奇数个,舍弃最后一个字节
	 *       如果连续的负数是偶数个,不舍弃
	 */
		
	String str="abc你好";
	 byte[] buf= str.getBytes("GBK");
   
      for(int x=0;x<buf.length;x++)
      {
	   String temp= cutStringByCount(str,x+1);
	   System.out.println(temp);
      }
      }

	private static String cutStringByCount(String str, int len) throws IOException {
		byte[] buf= str.getBytes("GBK");
		int count=0;
		for(int x=len-1;x>=0;x--)
		{
			if(buf[x]<0){
				count++;
			}else { 
				break;
			}
		}
		if(count%2==0)
		{
			return new String(buf,0,len);
		}
		else{
			return new String(buf,0,len-1);
		}
		
	}
	}