首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

按雙位元組長度截取字串工具方法

     編輯:Java 相關知識

處理中英混排字串時,常需按「雙位元組長度」(中文算 2、英文算 1)截取並加省略號。本工具方法精確實現此邏輯,支援含中文、全形符號等雙位元組字元的字串截取。

核心邏輯

  • 以 getBytes().length 獲取字串實際位元組長度
  • 遍歷字元陣列,用正則 [^\x00-\xff] 判斷雙位元組字元(含中文、日文、韓文、全形符號等)
  • 雙位元組字元計長 2,單位元組計長 1
  • 截取長度達標時,若最後一字元為雙位元組且會導致超長,則捨棄該字元
  • 超長時補加 ...,未超長返回原字串

完整代碼


/**
 * 按雙位元組長度截取字串
 * @param str  原始字串
 * @param len  目標雙位元組長度(中文算2,英文算1)
 * @return 截取後字串,超長加 "..."
 */
public static String getStrByLength(String str, int len) {
    if (str == null) return "";
    int byteLen = str.getBytes().length;
    if (byteLen > len * 2) {
        StringBuffer sb = new StringBuffer();
        char[] arr = str.toCharArray();
        for (int i = 0, j = 0; i < arr.length && j < len * 2; i++) {
            // 判斷是否雙位元組字元
            if (String.valueOf(arr[i]).matches("[^\\x00-\\xff]")) {
                j += 2;
            } else {
                j++;
            }
            // 邊界處理:若剛好達到長度-1且下一字元是雙位元組,則停止
            if (j == len * 2 - 1 && String.valueOf(arr[i]).matches("[^\\x00-\\xff]")) {
                continue; // 不追加該字元
            } else {
                sb.append(arr[i]);
            }
        }
        return sb.toString() + "...";
    }
    return str;
}

使用示例


getStrByLength("Hello世界", 5);  // "Hello..." (H e l l o = 5, 世 界 = 4 超長)
getStrByLength("Hello世界", 7);  // "Hello世..." (5+2=7 剛好)
getStrByLength("Hello", 10);     // "Hello" (未超長)

注意事項

  • getBytes() 使用平台預設編碼,跨平台建議指定 getBytes("UTF-8") 或 GBK
  • 正則 [^\x00-\xff] 涵蓋所有非 ASCII 字元,比單純判斷中文範圍 [\u4e00-\u9fa5] 更通用
  • 邊界邏輯確保不產生「半個中文」截斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved