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

出处:泡泡网络教程 [ http://www.hugo8.com ]

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

以下代码来源网络:
'*************************************    
'切割内容 - 按字符分割  
'中文算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 的代码转换。

原创文章如转载,请注明出处:泡泡网络教程 [ http://www.hugo8.com ]
本文链接地址:http://www.hugo8.com/article.asp?id=118
posted @ 2010-09-10 10:37  秋风无叶  阅读(433)  评论(0编辑  收藏  举报