截取字符串指定指定字节数的内容,汉字不能截取部分

截取字符串指定指定字节数的内容,如果指定的字节数在汉字的中间,汉字不能截取部分,只截取前面的内容。

思路:                                                                   
重点是要区分采用何种编码,因为不同编码格式对应的字节数不同(iso-8859-1 不区分中英文,都占1个字节,UnicodeBigUnmarked 不区分中英文、全角,都占2个字节)

假设截取 n个字节,                                                            
截取字符串的n个字符,n个字符的GBK编码的字节数一定>=要截取字节个数,如果等于说明全是字母                       
如果不等,说明包含汉字,截取的n个字符的字节数>需要截取的n个字节,故截取字符n-1,                           
再次进行比较,直到,字节数n  和       截取字符串的字节数相等,那么所截取的字符串就是结果。


public static void main(String[] args) throws UnsupportedEncodingException {
		getSystemEncode();

		String en = "a";
		String cn = "我";
		String qj = "*";
		System.out.println("英文_ISO-8859-1:" + en.getBytes("ISO-8859-1").length);
		System.out.println("汉字_ISO-8859-1:" + cn.getBytes("ISO-8859-1").length);
		System.out.println("全角字符_ISO-8859-1:" + qj.getBytes("ISO-8859-1").length);
		System.out.println("英文_GBK:" + en.getBytes("GBK").length);
		System.out.println("汉字_GBK:" + cn.getBytes("GBK").length);
		System.out.println("全角字符_GBK:" + qj.getBytes("GBK").length);
		System.out.println("英文_UTF-8:" + en.getBytes("UTF-8").length);
		System.out.println("汉字_UTF-8:" + cn.getBytes("UTF-8").length);
		System.out.println("全角字符_UTF-8:" + qj.getBytes("UTF-8").length);
		System.out.println("英文_UnicodeBigUnmarked:" + en.getBytes("UnicodeBigUnmarked").length);
		System.out.println("汉字_UnicodeBigUnmarked:" + cn.getBytes("UnicodeBigUnmarked").length);
		System.out.println("全角字符_UnicodeBigUnmarked:" + qj.getBytes("UnicodeBigUnmarked").length);

		String str = "abc我+-*/=?们啊ddd";
		/*
		 * 这里还和截取何种编码的字节数有关, 如果截取9个字节 GBK 是 "abc我们啊" UTF8是 "abc我们"
		 */
		System.out.println(subStringByBytes(str, 9, "gbk"));
		System.out.println(subStringByBytes(str, 9, "utf-8"));
		System.out.println(subStringByBytes(str, 9, "UnicodeBigUnmarked"));
		

	}

	/**
	 * 
	 * @param str
	 *            要截取的字符串
	 * @param bytes
	 *            截取的字节数
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String subStringByBytes(String str, int bytes, String charSetName)
			throws UnsupportedEncodingException {
		String subAfter = str.substring(0, bytes);
		int temp = bytes;
		try {
			// 直到截取的字符串的字节数 和 需要的 截取的字节数相等位为止
			while (bytes < subAfter.getBytes(charSetName).length) {
				subAfter = subAfter.substring(0, --temp);
			}
			System.out.println(temp);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return subAfter;
	}

	/**
	 * 
	 * @return 当前系统的编码格式
	 */
	public static String getSystemEncode() {
		System.getProperties().list(System.out);// 得到当前的系统属性。并将属性列表输出到控制台
		String encoding = System.getProperty("file.encoding");
		System.out.println("Encoding:" + encoding);
		System.out.println("---------------------");

		return encoding;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值