建站代码网

热门标签

兼容UTF-8和GBK编码的ASP文字截取函数

最近在网上搜索了下文字截取的函数,发现以下代码出现的几率非常高,于是便测试了一下。


'************************************* '切割内容 - 按字符分割 '中文算2个字符 '************************************* Function CutStr(byVal Str,byVal StrLen) Dim l,t,c,i If IsNull(Str) Then CutStr="":Exit Function l=Len(str) StrLen=int(StrLen) t=0 For i=1 To l c=Asc(Mid(str,i,1)) If c >= 0 And c <= 255 Then t=t+1 Else t=t+2 IF t>StrLen Then CutStr=left(Str,i-1)&"..." Exit For Else CutStr=Str End If Next End Function 将整站转换成UTF-8编码时,这个函数不能使用了。因为很明显,他的判断方法是 if asc(mid(str,x,1)) < 0 Then ,而非ASCII编码的页面中,ASC函数也就失去了作用。于是查找了相关的资料,终于找到解决方案:

Asc 返回输入字符的代码数据点或字符代码。对于单字节字符集 (SBCS),返回值范围为 0 到 255;对于双字节字符集 (DBCS),返回值范围为 -32768 到 32767。返回值取决于当前线程的代码页,该代码页包含在 TextInfo 类的 ANSICodePage 属性中。可以通过指定 System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage 来获得 TextInfo.ANSICodePage。

AscW 返回输入字符的 Unicode 代码数据点。返回值范围为 0 到 65535。返回值与当前线程的区域性和代码页设置无关。

注意   对于字节,Visual Basic 早期版本的 AscB 函数返回的是代码,而不是字符。它主要用于在双字节字符集 (DBCS) 应用程序中转换字符串。所有 Visual Basic .NET 字符串均采用 Unicode 的形式,并且不再支持 AscB。

也就是说,在utf-8编码格式下,需要用AscW来“辨认”中英文才行!

至此,将上面CutStr函数中


以下是引用片段:


c=Asc(Mid(str,i,1))


修改为

以下是引用片段:


c=AscW(Mid(str,i,1))

结果如预期效果一致! 相关演示如本网站侧边栏文章列表,截取自定义长度,中文为两字符! 附Asc函数的相关知识:

以下是引用片段: Asc 函数        返回与字符串的第一个字母对应的 ANSI 字符代码。  Asc(string)     string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。  说明  下面例子中, Asc 返回每一个字符串首字母的 ANSI 字符代码:  Dim MyNumber  MyNumber = Asc("A")       ''返回 65。  MyNumber = Asc("a")       ''返回 97。  MyNumber = Asc("Apple")   ''返回 65。  注意    AscB 函数和包含字节数据的字符串一起使用。AscB 不是返回第一个字符的字符代码,而是返回首字节。AscW 是为使用 Unicode 字符的 32 位平台提供的。它返回 Unicode (宽型)字符代码,因此可以避免从 ANSI 到 Unicode 的代码转换。


X