设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
11#
 楼主| 发表于 2014-4-26 09:37:08 | 只看该作者
zhuyiwen 发表于 2014-4-26 08:53
有意思的题目,呵呵

朱总有空指点一下啊。上面的示例一是没有加“字节长度”的参数,这个我可以修改;二是不足字节长度的没有加" "空格补齐,代码里一时看不出来在哪里加。
12#
 楼主| 发表于 2014-4-26 09:42:06 | 只看该作者

谢谢!可用。我先按这思路修改一下可按字节长度变量进行分割的函数
13#
 楼主| 发表于 2014-4-26 11:33:23 | 只看该作者
搞了一上午终于搞定了,附上源代码:

Function test(zf As Variant, n As Integer)
On Error Resume Next        '当N为奇数时
Dim tmp As String
Dim m As Integer, i As Integer
For i = 1 To Len(zf)
tmp = tmp & Mid(zf, i, 1)
Select Case Asc(Mid(zf, i, 1))
Case Is > 0
a = a + 1           '英文字符
Case Else
a = a + 2           '中文字符
End Select
If a = n Then test = test & tmp & "\": tmp = "": a = 0
If a = n - 1 Then If Asc(Mid(zf, i + 1, 1)) < 0 Then test = test & tmp & " \": tmp = "": a = 0
If i = Len(zf) And a < n - 1 And a <> 0 Then test = test & tmp & Space(n - a) & "\": a = 0   '最后一段如果不够字节长度N时
Next i
End Function

谢谢楼上各位,如果有更简单的办法可继续讨论

14#
发表于 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差不多。
15#
发表于 2014-4-26 14:03:35 | 只看该作者
还有没有更快的方法呢,看着StrConv要进行一次转换真不爽!
再写一个
16#
 楼主| 发表于 2014-4-26 14:26:34 | 只看该作者
wang1999 发表于 2014-4-26 14:03
还有没有更快的方法呢,看着StrConv要进行一次转换真不爽!
再写一个

转换成字节问题不大,用下面这个就可以了,现在遇到新问题,开新贴问。
For i = 1 To Len(zf)
Select Case Asc(Mid(zf, i, 1))
Case Is > 0
a = a + 1           '英文字符
Case Else
a = a + 2           '中文字符
End Select
17#
发表于 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几条街了
18#
发表于 2014-4-26 14:38:36 | 只看该作者
玉树TMD临风 发表于 2014-4-26 14:26
转换成字节问题不大,用下面这个就可以了,现在遇到新问题,开新贴问。
For i = 1 To Len(zf)
Select  ...

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


19#
 楼主| 发表于 2014-4-26 14:59:48 | 只看该作者
wang1999 发表于 2014-4-26 14:38
这个算法有些情况下是有问题的
用你的这个算法试试下面的字符串
    Str = "ΑΒΓαβγ" '希腊字符

我这代码算出来是12,应该是多少?
20#
 楼主| 发表于 2014-4-26 15:03:14 | 只看该作者
wang1999 发表于 2014-4-26 14:38
这个算法有些情况下是有问题的
用你的这个算法试试下面的字符串
    Str = "ΑΒΓαβγ" '希腊字符

不过我的代码把所有英文字符以外的都算双字节,你这些字母我也不知道是单还是双,所以用我的代码是按双字节算出来的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 14:13 , Processed in 0.103219 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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