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中"
Function SubstZFC_UTF8(str, strlen)
' 需將字符串按 UTF-8 字符邊界迭代
' VBScript 原生不支援,建議改用 JScript (支援 Unicode 代理對)
' 或調用 .NET COM 組件 / 升級 ASP.NET
End Function
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 行代碼解決核心痛點,經得起時間考驗。