萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> ASP 程式設計

ASP 精準字符串截取函數:中英文混排、雙字節寬度計算、HTML 實體保護

Left(str, n) 按字符截取,中文佔 1 字符導致顯示寬度不一。本函數 SubstZFC 按視覺寬度截取:中文/全形算 2,英文/半形算 1,並保護 HTML 實體不被截斷。

完整函數代碼

<%
' 函數名:SubstZFC
' 作用:按視覺寬度截取字符串,中文算2、英文算1
' 參數:str - 原字符串,strlen - 目標寬度
' 返回:截取後字符串 (超出時不加省略號,調用者自行添加)
Public Function SubstZFC(ByVal str, ByVal strlen)
    If IsNull(str) Or str = "" Then
        SubstZFC = ""
        Exit Function
    End If
    
    Dim l, t, c, i, strTemp
    ' 1. HTML 實體預處理:轉義為佔位符,防止被截斷
    str = Replace(str, " ", Chr(1))   ' 佔位符 1
    str = Replace(str, """, Chr(2))     ' 佔位符 2
    str = Replace(str, ">",   Chr(3))     ' 佔位符 3
    str = Replace(str, "<",   Chr(4))     ' 佔位符 4
    
    l = Len(str)
    t = 0
    strTemp = str
    strlen = CLng(strlen)
    
    ' 2. 逐字符累加寬度
    For i = 1 To l
        c = Abs(AscW(Mid(str, i, 1)))
        If c > 255 Then
            t = t + 2  ' 雙字節字符 (中日韓、全形符號)
        Else
            t = t + 1  ' 單字節字符 (ASCII)
        End If
        
        If t >= strlen Then
            strTemp = Left(str, i)
            Exit For
        End If
    Next
    
    ' 3. 還原 HTML 實體
    strTemp = Replace(strTemp, Chr(1), " ")
    strTemp = Replace(strTemp, Chr(2), """)
    strTemp = Replace(strTemp, Chr(3), ">")
    strTemp = Replace(strTemp, Chr(4), "<")
    
    SubstZFC = strTemp
End Function
%>

使用範例

<%
Dim title : title = "【公告】ASP&技術分享:中英文混排測試"
Dim shortTitle : shortTitle = SubstZFC(title, 20)
Response.Write shortTitle & "..."
' 輸出:【公告】ASP&技術分享:中... (視覺寬度約 20)
%>

邏輯圖解

輸入: "AB中文" (A=1,B=1,中=2,文=2, 總寬度=6)
目標寬度=4
i=1: 'A' (ASCII 65)  → t=1
i=2: 'B' (ASCII 66)  → t=2
i=3: '中' (ASCW >255) → t=4 達標 → 截取 Left(str,3) = "AB中"

進階版:支援 UTF-8 多字節字符 (Emoji、生僻字)

Function SubstZFC_UTF8(str, strlen)
    ' 需將字符串按 UTF-8 字符邊界迭代
    ' VBScript 原生不支援,建議改用 JScript (支援 Unicode 代理對)
    ' 或調用 .NET COM 組件 / 升級 ASP.NET
End Function

常見應用場景

  • 列表頁標題統一長度顯示
  • 摘要自動生成 (配合去 HTML 標籤)
  • 瀏覽器 Title 截取 (限制 60 字符)
  • RSS/Atom Feed 摘要輸出
  • 短信內容長度控制 (70 字符/條)

配套函數:去 HTML 標籤 + 截取

Function PlainTextSubst(htmlStr, strlen)
    ' 1. 移除標籤
    Dim clean : clean = htmlStr
    clean = Replace(clean, "
", vbCrLf) clean = Replace(clean, "
", vbCrLf) clean = Replace(clean, "
", vbCrLf) ' 簡易移除所有 <...> (不處理屬性中 > 的情況) Dim reg : Set reg = New RegExp reg.Global = True reg.Pattern = "<[^>]+>" clean = reg.Replace(clean, "") ' 2. 解碼常見實體 clean = Replace(clean, " ", " ") clean = Replace(clean, """, """") clean = Replace(clean, ">", ">") clean = Replace(clean, "<", "<") clean = Replace(clean, "&", "&") ' 3. 截取 PlainTextSubst = SubstZFC(clean, strlen) End Function

視覺寬度截取是中文 Web 排版的剛需,SubstZFC 以 30 行代碼解決核心痛點,經得起時間考驗。

copyright © 萬盛學電腦網 all rights reserved