Java按字节数截取字符串

时间:2022-05-10 20:18:42

1、截取字符串,若是遇到不完整的中文,则舍弃掉那部分中文信息

碰到可能会截取汉字的情况,当然是要不能截取出乱码来,就是不能对整个汉字截取一半。如"我ABC汉字d"这个字符串,截取5个字节的时候,应该是"我ABC",而截取8个字节的时候,应该是"我ABC汉",而不应该是"我ABC汉?",其中"?"为半个汉字,可理解为向前截取

package com.lxh.ser.test;

import java.io.UnsupportedEncodingException;

public class SubStrTest {

private static final String DEFAULT_ENCODING = "GBK";

public static void main(String[] args) throws UnsupportedEncodingException {
String str = "我ABC汉字d";
for (int i = 0; i < str.getBytes(DEFAULT_ENCODING).length; i++) {
System.out.println("i: " + i + " " + subStr(str, i));
}
}

/**
* @param str 需要截取的字符串
* @param subSLength 需要截取的字节数
* @return 截取完成的字符串
* @throws UnsupportedEncodingException
*/
public static String subStr(String str, int subStrLength) throws UnsupportedEncodingException {
if (null == str) {
return "";
}
// 截取字节数
int tempSubLength = subStrLength;
// 截取的子串
String subStr = str.substring(0, str.length() < subStrLength ? str.length() : subStrLength);
// 截取子串的字节长度
int subStrByetsL = subStr.getBytes(DEFAULT_ENCODING).length;
// 比较截取后的字符串字节数大于需要截取的自己数,说明截取的字符串中包含有汉字并且截取后的字节数大于需要的字节数
while (subStrByetsL > tempSubLength) {
int subSLengthTemp = --subStrLength;
// 再少截取一个字符
subStr = str.substring(0, subSLengthTemp > str.length() ? str.length() : subSLengthTemp);
subStrByetsL = subStr.getBytes(DEFAULT_ENCODING).length;
}
return subStr;
}
}