设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: 玉树TMD临风
打印 上一主题 下一主题

[其它] 【已解决】如何将字符串按定长字节分割成多个字符串?

[复制链接]
1#
发表于 2014-4-26 13:23:22 | 显示全部楼层
本帖最后由 wang1999 于 2014-4-26 15:01 编辑

前天听完课后,答应你回复你,可一直太忙,今天刚只有一点空,先给出代码给你。有空再深入分析吧
核心是计算中文字节长度,在VB5时代直接可以用LEN函数即可,可UNICODE就不同了。
目前我知道方法有4种,核心代码如下

算法一利用StrConv(比算法二快9倍)
'-----------------------------------------------------------------
Public Function LenEx(VarString As Variant) As Variant
'算法一
    LenEx = LenB(StrConv(VarString, vbFromUnicode))    '将Unicode转换为ANSI,然后再计算字节长度
End Function
''算法二
'Public Function LenEx1(VarString As Variant) As Variant
'    Dim lLen As Integer, i As Integer
'    LenEx1 = 0
'    lLen = Len(VarString)
'    If lLen Then                              '如长度不为零
'        For i = 1 To lLen
'            If Asc(Mid(VarString, i, 1)) < 0 Then
'                LenEx1 = LenEx1 + 2
'            Else
'                LenEx1 = LenEx1 + 1
'            End If
'        Next
'    End If
'End Function

方法四,利用 lstrlenA 函数, 等于利用VB的后台U/A转换,效率跟StrConv差不多。
2#
发表于 2014-4-26 14:03:35 | 显示全部楼层
还有没有更快的方法呢,看着StrConv要进行一次转换真不爽!
再写一个
3#
发表于 2014-4-26 14:28:46 | 显示全部楼层
'算法三     直接操作对比Unicode码
Function LenDB(Str As String) As Long
    Dim i As Long, lngLenB As Long
    Dim abytStr() As Byte
    Const DoubleByte As Byte = &H30
    abytStr = Str
    lngLenB = LenB(Str)
    For i = 1& To lngLenB Step 2&
        If abytStr(i) < DoubleByte Then
            lngLenB = lngLenB - 1&
        End If
    Next
    LenDB = lngLenB
End Function

算法三应该甩开算法StrConv几条街了
4#
发表于 2014-4-26 14:38:36 | 显示全部楼层
玉树TMD临风 发表于 2014-4-26 14:26
转换成字节问题不大,用下面这个就可以了,现在遇到新问题,开新贴问。
For i = 1 To Len(zf)
Select  ...

这个算法有些情况下是有问题的
用你的这个算法试试下面的字符串
    Str = "ΑΒΓαβγ" '希腊字符


5#
发表于 2014-4-26 15:11:43 | 显示全部楼层
我不是提供了四个方法,你都 试试,
目前最完美的解决方案是,算法3了,不管准确度还是速度,你就直接用这个。

其实判定单双字节,本身就不是个很严谨的问题(因为它与你的字体有一定关系),只不过在一些特定环境却有一定用处。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-14 07:03 , Processed in 0.113516 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表