如有这么一个字符串:
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));
}
控制台输出的结果如下: