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

C# 字串長度計算:中文字符按雙字節處理的實作方案

     編輯:關於C#

在處理定長字串截取、資料庫欄位長度驗證或傳統系統介接時,常需依據「中文字佔 2 個字元、英數字佔 1 個字元」的規則計算字串長度。.NET Framework 內建的 String.Length 屬性僅回傳 Char 數量(UTF-16 代碼單元),無法直接滿足此需求。本文提供兩個實用的擴充方法,精確實現雙字節長度計算與定長截取。

核心邏輯:區分單雙字節字符

判斷依據:Unicode 編碼中,基本多文種平面(BMP)的中日韓統一表意文字碼點通常大於 255(0xFF)。因此,透過 Convert.ToInt32(char) > 255 即可簡易區分:

  • 單字節:ASCII 字元(英數字、符號),碼點 ≤ 255
  • 雙字節:中文字、全形符號等,碼點 > 255

方法一:GetLength - 計算雙字節長度

private int GetLength(string orgStr)
{
    int len = orgStr.Length; // 基礎長度(每字元算 1)
    foreach (char c in orgStr)
    {
        if (Convert.ToInt32(c) > 255) len++; // 雙字節字元額外加 1
    }
    return len;
}

原理:先以字元數為基準,遇到雙字節字元則再加 1,最終等同於「單字節×1 + 雙字節×2」。

方法二:MutiSubString - 定長截取並回傳剩餘字串

private string MutiSubString(string orgStr, int length, ref string afterStr)
{
    int start = 0, end = orgStr.Length, singleCount = 0;
    char[] chars = orgStr.ToCharArray();

    for (int i = 0; i < chars.Length; i++)
    {
        if (Convert.ToInt32(chars[i]) > 255) start += 2;
        else { start += 1; singleCount++; }

        if (start >= length)
        {
            // 處理邊界:確保不截斷雙字節字元
            if (length % 2 == 0)
                end = (singleCount % 2 == 0) ? i + 1 : i;
            else
                end = i + 1;
            break;
        }
    }

    string result = orgStr.Substring(0, end);
    afterStr = orgStr.Remove(0, end);
    return result;
}

關鍵點:

  1. 累加 start 模擬雙字節長度
  2. 記錄單字節數 singleCount 協助邊界判斷
  3. 當目標長度為偶數時,若已讀單字節數為奇數,需向前縮減一字元,避免截斷雙字節字元
  4. 透過 ref 參數回傳剩餘字串,方便連續處理

實測範例

string afterStr;
string result = MutiSubString("abc漢字字符", 5, ref afterStr);
// result  = "abc漢"  (a=1,b=1,c=1,漢=2 → 總長 5)
// afterStr = "字字符"

此實作有效解決了 String.Length 將中文視為單字元的問題,適用於定長檔案產生、舊系統資料遷移、報表列印對齊等場景。若需支援補充平面字符(Emoji、罕用字),建議改用 StringInfo 類或 Rune 結構(.NET Core 3.0+)處理代碼點。

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