网络编程
位置:首页>> 网络编程>> Asp编程>> 关于utf-8格式中截取中英文字符串长度无效的问题

关于utf-8格式中截取中英文字符串长度无效的问题

作者:hayden 来源:烦恼's BLOG 发布时间:2008-11-25 14:00:00 

标签:utf-8,编码,字符串,中文

关于截取字符串指定长度的自定义函数很多,各式各样!

不过大多原理都是一个样,循环字符串判断每一个字符的asc码!

我这里也有一个,示例函数如下:

 程序代码

'*************************************    
'切割内容 - 按字符分割   
'中文算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编码格式下,上面的这个自定义函数好像就辨认不出中文还是英文了!而在gb2312编码格式下却不存在此问题。
如下:

 程序代码

dim str : str = CutStr("12345一二三四五",8)
'结果为:str = "12345一二三..."

为什么会出现这样的问题呢?

经查资料终于找到解决方案:

 引用内容

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。

原文:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vblr7/html/vafctasc.asp


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

至此,将上面CutStr函数中

程序代码

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

修改为

 程序代码

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

结果如预期效果一致!

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com