Java解析固定长度并且带中文的字符串

如有这么一个字符串:

String temp = "1234567890一二三四五111213141516六七八九十一17181920"

需要按照长度为10,10,12,12,8的固定长度来取出每一段数据;

正常我们应该是使用temp.substring(0, 10)来取每一段时间,但是如果遇到有中文的情况取出来的数据就有问题了。

原因是:java中,中文字符是当作一个字节来表示的,而在C语言中,一个中文是两个字节的。

故在这里,我封装了如下方法来分割固定长度的字符串:

public static byte[] hexString2Bytes(String data) {
		byte[] result = new byte[(data.length() + 1) / 2];
		if ((data.length() & 1) == 1) {
			data = data + "0";
		}

		for (int i = 0; i < result.length; ++i) {
			result[i] = (byte) (hex2byte(data.charAt(i * 2 + 1)) | hex2byte(data
					.charAt(i * 2)) << 4);
		}

		return result;
	}
public static String bytes2HexString(byte[] data) {
		StringBuilder buffer = new StringBuilder();
		byte[] var5 = data;
		int var4 = data.length;

		for (int var3 = 0; var3 < var4; ++var3) {
			byte b = var5[var3];
			String hex = Integer.toHexString(b & 255);
			if (hex.length() == 1) {
				buffer.append('0');
			}

			buffer.append(hex);
		}

		return buffer.toString().toUpperCase();
	}
public static String getFixLengthString(String string, int index, int length) {
		if (string == null || string.length() == 0) {
			return null;
		}
		
		String hexString = bytes2HexString(string.getBytes());
		if (hexString == null || hexString.length() == 0) {
			return null;
		}
		
		if (hexString.length() < (index * 2 + length * 2)) {
			return null;
		}
		
		String temp = hexString.substring(index * 2, index * 2 + length * 2);
		if (temp == null || temp.length() == 0) {
			return null;
		}
		
		try {
			return new String(hexString2Bytes(temp), "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
	}

测试代码:

public static void main(String[] args) throws Exception {
		int index = 0;
		String temp = "1234567890一二三四五111213141516六七八九十一17181920";
		System.out.println(getFixLengthString(temp, index, 10));
		index += 10;
		System.out.println(getFixLengthString(temp, index, 10));
		index += 10;
		System.out.println(getFixLengthString(temp, index, 12));
		index += 12;
		System.out.println(getFixLengthString(temp, index, 12));
		index += 12;
		System.out.println(getFixLengthString(temp, index, 8));
		index += 8;
		System.out.println(getFixLengthString(temp, index, 8));
	}

控制台输出的结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值