最近在网上搜索了下文字截取的函数,发现以下代码出现的几率非常高,于是便测试了一下。
'*************************************
'切割内容 - 按字符分割
'中文算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 的代码转换。
热门信息
阅读 (198)
1 独特的随机字母阅读 (172)
2 检查和设置IIS服务器正确的权限阅读 (164)
3 ASP-对象阅读 (164)
4 asp网站伪静态化URL Rewrite中的httpd.ini伪静态化规则编写方法阅读 (163)
5 asp取access数据库里本周、本月、本季度的记录~