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

C# 截取中英混合字串:按位元組長度精準截斷並補省略號

     編輯:關於C#

需求場景

文章列表顯示標題,限制顯示寬度 (以位元組計),中文佔 2 位元組、英文 1 位元組,超出部分補 ...,且不能將中文字元從中間截斷。

解法:Regex 替換計算位元組長度

public static string GetSubString(string s, int byteLen)
{
    if (string.IsNullOrEmpty(s)) return s;

    // 將中文字元替換為 "zz" (2 字元),再算 Length 即為位元組長度
    string replaced = Regex.Replace(s, "[\u4e00-\u9fa5]", "zz");
    if (replaced.Length <= byteLen) return s; // 未超長

    // 從尾部往前嘗試截取
    for (int i = s.Length; i >= 0; i--)
    {
        string sub = s.Substring(0, i);
        string subReplaced = Regex.Replace(sub, "[\u4e00-\u9fa5]", "zz");
        if (subReplaced.Length <= byteLen - 3) // 預留 "..." 3 位元組
        {
            return sub + "...";
        }
    }
    return "...";
}

測試案例

string s1 = "中國人要啊abc呀~";
string s2 = "1中國人23456abc呀~";

Console.WriteLine(GetSubString(s1, 8));  // 中國人要...
Console.WriteLine(GetSubString(s2, 8));  // 1中國人2...

原理說明

  • Unicode 範圍 \u4e00-\u9fa5 涵蓋常用漢字。
  • 替換為定長字串 "zz",Length 即等同位元組長度 (假設雙位元組編碼)。
  • 反向遞減截取,保證找到最大合法長度。
  • 扣除 ... 的 3 位元組後再比較。

效能優化版 (避免重複 Regex)

public static string GetSubStringFast(string s, int byteLen)
{
    if (string.IsNullOrEmpty(s)) return s;

    byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(s); // 或 Big5
    if (bytes.Length <= byteLen) return s;

    int charCount = Encoding.GetEncoding("GB2312").GetChars(bytes, 0, byteLen - 3).Length;
    return s.Substring(0, charCount) + "...";
}

直接用編碼器轉換,一次運算得出字元數,效能大幅提升,且自動處理截半字元問題 (解碼器會捨棄不完整位元組序列)。

小結

Regex 替換法邏輯清晰易懂;編碼器法效能更佳且自動處理邊界。依專案效能需求選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved