按字節長度截取字符串


業務場景:Oracle數據字符集UTF-8,字段類型為VARCHAR2(2000)。當插入字符串的字節長度超過2000時,就會報錯,使用subString(0,2000)當字符串包含中文時,也會報錯,又不能直接只截取1000長度。所以需要一個根據字節長度來截取字符串的方法。

下面提供一下utf-8的截取方法:

GitHub地址 https://github.com/beiifeng/StringUtils/blob/master/StringUtils.java

/**
* 按字節長度截取字符串
*
* @param orgin 需要截取的字符串
* @param blength 需要保留的字節長度
* @param charsetName 編碼,對於字符集為UTF-8的數據庫,請指定編碼為UTF-8;字符集為GBK的數據庫,請指定編碼GBK
* @return 截取后的字符串
* @throws UnsupportedEncodingException 不支持的字符編碼
*/
public static String subStringb(String orgin, int blength, String charsetName) throws UnsupportedEncodingException {
return subStringb2(orgin, blength, charsetName).get(0);
}

/**
* 按字節長度分割字符串
*
* @param orgin 需要截取的字符串
* @param blength 需要保留的字節長度
* @param charsetName 編碼,對於字符集為UTF-8的數據庫,請指定編碼為UTF-8;字符集為GBK的數據庫,請指定編碼GBK
* @return 分割后的字符串
* @throws UnsupportedEncodingException 不支持的字符編碼
*/
public static List<String> subStringb2(String orgin, int blength, String charsetName) throws UnsupportedEncodingException {

List<String> result = new ArrayList<>();
int length;

byte[] bs = orgin.getBytes(charsetName);
while (bs.length > 0) {
length = blength;
if (length >= bs.length) {
result.add(new String(bs, 0, bs.length, charsetName));
break;
}
if ("UTF8".equals(charsetName.toUpperCase()) || "UTF-8".equals(charsetName.toUpperCase())) {
// utf8 encoding
// 0000 0000 - 0000 007F 0xxxxxxx
// 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
// 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
// 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
while (length > 0) {
if ((bs[length] | 0x7F) == 0x7F) {
break;
}
if ((bs[length] & 0xC0) == 0xC0) {
break;
}
/*
if ((bs[length] & 0xE0) == 0xE0) {
break;
}
if ((bs[length] & 0xF0) == 0xF0) {
break;
}
*/
length--;
}
} else if ("GBK".equals(charsetName.toUpperCase())) {
boolean removLast = length % 2 == 1;
for (int i = 0; i < length; i++) {
if ((bs[i] | 0x7F) == 0x7F) {
removLast = !removLast;
}
}
if (removLast) {
length--;
}
} else if ("UNICODE".equals(charsetName.toUpperCase())) {
if (length % 2 == 1) {
length--;
}
} else if ("UTF-16".equals(charsetName.toUpperCase()) || "UTF16".equals(charsetName.toUpperCase())) {
if (length % 2 == 1) {
length--;
}
} else if ("UTF-16BE".equals(charsetName.toUpperCase())) {
if (length % 2 == 1) {
length--;
}
} else if ("UTF-16LE".equals(charsetName.toUpperCase())) {
if (length % 2 == 1) {
length--;
}
}
result.add(new String(bs, 0, length, charsetName));
bs = Arrays.copyOfRange(bs, length, bs.length);
}
    if (result.size() == 0) {
result.add("");
}
    return result;
}

 

待更新:截取結果為字符串數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM