设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 7486|回复: 20
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2014-4-25 21:57:12 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 玉树TMD临风 于 2014-4-26 11:36 编辑

有个字符串A,里面有中、英文,中文算2个字符,英文算一个字节。

现在想将字符串按字节分割,用"\"隔开,如果分割处刚好是个汉字各占一半,那这个汉字就算到下个分割后的字符串,缺的那个字节用空格顶上。

比如:
字符串A="我1人2年吃了3斤油“,要求按3个字节分割。

正确结果是:“我1\人2\年 \吃 \了3\斤 \油 ",因为”我“的字节长度是2,”1“的字节长度是1,加起来刚好是3,以此类推。。。

这个看起来简单,可我弄了2天没弄好,特来求助。

已搞定,谢谢各位,附上源码:

Function test(zf As Variant, n As Integer)

On Error Resume Next        '当N为某此数值时,下面的I+1会超出字符长度而报错

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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2014-4-25 22:47:19 来自手机 | 显示全部楼层
谢谢,回头试试,还需要个定长数字变量来自: Android客户端
3#
 楼主| 发表于 2014-4-26 01:52:22 来自手机 | 显示全部楼层
谢谢楼上各位,明天测试后回复大家!
4#
 楼主| 发表于 2014-4-26 01:53:26 来自手机 | 显示全部楼层
谢谢各位,明天试试
5#
 楼主| 发表于 2014-4-26 09:37:08 | 显示全部楼层
zhuyiwen 发表于 2014-4-26 08:53
有意思的题目,呵呵

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

谢谢!可用。我先按这思路修改一下可按字节长度变量进行分割的函数
7#
 楼主| 发表于 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

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

8#
 楼主| 发表于 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
9#
 楼主| 发表于 2014-4-26 14:59:48 | 显示全部楼层
wang1999 发表于 2014-4-26 14:38
这个算法有些情况下是有问题的
用你的这个算法试试下面的字符串
    Str = "ΑΒΓαβγ" '希腊字符

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

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

本版积分规则

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

GMT+8, 2024-5-16 00:37 , Processed in 0.180630 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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