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

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

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

不过大多原理都是一个样,循环字符串判断每一个字符的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))    

结果如预期效果一致!

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

猜你喜欢

  • 如何快速通过XSL转换XML文件

    2023-07-02 21:22:40
  • Python数据存储之 h5py详解

    2023-09-18 00:04:48
  • 使用Python批量压缩tif文件操作步骤

    2021-03-27 00:04:10
  • MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解

    2024-01-17 17:53:34
  • 设计模式学习笔记之 - 简单工厂模式

    2009-03-11 13:38:00
  • python中sklearn的pipeline模块实例详解

    2021-09-05 00:57:34
  • Python如何发送与接收大型数组

    2022-07-26 06:54:54
  • Python源码学习之PyObject和PyTypeObject

    2023-08-11 10:28:45
  • Firebox 3 后退后按钮 diasabled 状态不恢复的一个解决方案

    2008-11-06 12:28:00
  • python 获取谷歌浏览器保存的密码

    2022-05-21 21:39:49
  • python将字符串list写入excel和txt的实例

    2022-02-28 05:07:01
  • python用Pygal如何生成漂亮的SVG图像详解

    2022-12-12 21:45:22
  • Windows自动执行python脚本操作步骤

    2023-04-22 15:32:42
  • Python面向对象程序设计类的多态用法详解

    2021-05-28 20:21:29
  • django 解决model中类写不到数据库中,数据库无此字段的问题

    2024-01-24 17:52:07
  • Javascript 注册事件浅析

    2024-04-28 10:20:22
  • python实现简单俄罗斯方块

    2022-10-21 07:37:27
  • 使用DW中遇到的常见问题详解

    2008-03-18 16:27:00
  • python简单的函数定义和用法实例

    2022-10-07 12:35:03
  • Oracle数据库表空间超详细介绍

    2024-01-17 16:49:22
  • asp之家 网络编程 m.aspxhome.com