设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 8454|回复: 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:38:33 | 只看该作者
试一下这个,好像还有一点小问题,麻烦你自己测试了
  1. Public Function test(oldTXT As String) As String
  2.     Dim newTXT As String
  3.     Dim x As Integer, y As Integer
  4.     x = Len(oldTXT)
  5.     y = 1
  6.     Do Until y > x
  7.         If Mid(oldTXT, y, 1) Like "[a-z,0-9]" Then
  8.             newTXT = newTXT & Mid(oldTXT, y, 1) & ""
  9.             y = y + 1
  10.         Else
  11.             If Mid(oldTXT, y + 1, 1) Like "[a-z,0-9]" Then
  12.                 newTXT = newTXT & Mid(oldTXT, y, 2) & ""
  13.                 y = y + 2
  14.             Else
  15.                 newTXT = newTXT & Mid(oldTXT, y, 1) & " "
  16.                 y = y + 1
  17.             End If
  18.         End If
  19.     Loop
  20.     test = newTXT
  21. End Function
复制代码

  1. ?test("1我a人2年吃了3斤油")
  2. 1\我a\人2\年 \吃 \了3\斤 \油 \
复制代码
3#
 楼主| 发表于 2014-4-25 22:47:19 来自手机 | 只看该作者
谢谢,回头试试,还需要个定长数字变量来自: Android客户端

点击这里给我发消息

4#
发表于 2014-4-25 22:56:07 | 只看该作者
  1. Public Function test(oldTXT As String) As String
  2.     Dim newTXT As String
  3.     Dim x As Integer, y As Integer
  4.     x = Len(oldTXT)
  5.     y = 1
  6.     Do Until y > x
  7.         If Mid(oldTXT, y, 1) Like "[a-z,0-9]" Then
  8.             newTXT = newTXT & Mid(oldTXT, y, 1)
  9.             y = y + 1
  10.             If Mid(oldTXT, y, 1) Like "[a-z,0-9]" Then
  11.                 newTXT = newTXT & Mid(oldTXT, y, 1)
  12.                 y = y + 1
  13.                 If Mid(oldTXT, y, 1) Like "[a-z,0-9]" Then
  14.                     newTXT = newTXT & Mid(oldTXT, y, 1) & ""
  15.                     y = y + 1
  16.                 Else
  17.                     newTXT = newTXT & " "
  18.                 End If
  19.             Else
  20.                 newTXT = newTXT & Mid(oldTXT, y, 1) & ""
  21.                 y = y + 1
  22.             End If
  23.         Else
  24.             If Mid(oldTXT, y + 1, 1) Like "[a-z,0-9]" Then
  25.                 newTXT = newTXT & Mid(oldTXT, y, 2) & ""
  26.                 y = y + 2
  27.             Else
  28.                 newTXT = newTXT & Mid(oldTXT, y, 1) & " "
  29.                 y = y + 1
  30.             End If
  31.         End If
  32.     Loop
  33.     test = newTXT
  34. End Function
复制代码

  1. ?test("11我a人2年吃了3斤油")
  2. 11 \我a\人2\年 \吃 \了3\斤 \油 \
  3. ?test("我a人2年吃了3斤油")
  4. 我a\人2\年 \吃 \了3\斤 \油 \
  5. ?test("1我a人2年吃了3斤油")
  6. 1我\a人\2年\吃 \了3\斤 \油 \
复制代码
5#
发表于 2014-4-26 00:20:58 | 只看该作者
  1. <p>Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long</p><p>
  2. Function Test(strText) As String
  3.   Dim str As String
  4.   Dim temstr As String
  5.   Dim s As String
  6.   Dim k As String
  7.   Dim n As Integer
  8.   Dim m As Integer
  9.   Dim i As Integer
  10. ' str = "他1a1我1a人2年吃了3斤油2你"
  11.   For i = 1 To Len(strText)
  12.      temstr = Mid(strText, i, 1)
  13.      n = lstrlen(temstr + Chr(0))
  14.      m = m + n
  15.      If m > 3 Then
  16.        k = k & s & ""
  17.        s = temstr
  18.        m = n
  19.      Else
  20.       s = s & temstr
  21.     End If
  22.   Next
  23.   
  24. If Len(s) > 0 Then
  25.    k = k & s & ""
  26. End If
  27. Test = k
  28. End Function
  29. </p><p>
  30. </p><p>Debug.Print Test("玉1树1临1,风aTMD,人2年吃了3斤油2你")</p><p>返回:玉1\树1\临1\,风\aTM\D,\人2\年\吃\了3\斤\油2\你\
  31. </p>
复制代码
6#
发表于 2014-4-26 00:23:59 | 只看该作者
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long


Function Test(strText) As String
  Dim str As String
  Dim temstr As String
  Dim s As String
  Dim k As String
  Dim n As Integer
  Dim m As Integer
  Dim i As Integer
' str = "他1a1我1a人2年吃了3斤油2你"
  For i = 1 To Len(strText)
     temstr = Mid(strText, i, 1)
     n = lstrlen(temstr + Chr(0))
     m = m + n
     If m > 3 Then
       k = k & s & "\"
       s = temstr
       m = n
     Else
      s = s & temstr
    End If
  Next
  
If Len(s) > 0 Then
   k = k & s & "\"
End If
Test = k
End Function
7#
发表于 2014-4-26 00:24:33 | 只看该作者
记得引用API
8#
 楼主| 发表于 2014-4-26 01:52:22 来自手机 | 只看该作者
谢谢楼上各位,明天测试后回复大家!
9#
 楼主| 发表于 2014-4-26 01:53:26 来自手机 | 只看该作者
谢谢各位,明天试试

点击这里给我发消息

10#
发表于 2014-4-26 08:53:53 | 只看该作者
有意思的题目,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-1 19:55 , Processed in 0.116361 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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