菜卷鱼 发表于 2021-7-3 11:32:24

按字符串长度分割字符串

(splen str len mark)
len 表示需要分割的长度
mark 是需要分割的长度大于1,刚好碰到双字节汉字时,加1位或者减1位

比如说 str= "hi,你好"

如果直接用strlen长度取4的时候, 会取到 "hi, ?    乱码了
碰到这种情况的时候 ,
如果mark = nil ,则会多取一位取到 hi,你
(splen str 4 nil) 的执行结果是 ("hi,你" "好")
如果mark = t, 则会少取一位取到 hi,
(splen str 4 nil) 的执行结果是 ("hi," "你好")

(splen str 2 nil)
返回("hi" ",你" "好")
(splen str 2 t)
返回("hi" "," "你" "好")

(defun splen (str len mark / ad l1 s1 sp g1)(if (not (> len 1))
    (setq ad 1 len 1)
    (if      mark
      (setq ad -1)
      (setq ad 1)
    )
)
(setq l1 (strlen str))
(while (> l1 len)
    (setq s1 len)
    (setq g1 (substr str 1 s1))
    (setq ns (strcat g1 "*"))
    (if      (and
      (wcmatch ns "*`*");;;;如果取到的字符是汉字的半个字符,跟*合并之后*号会被吸收掉,检测一下是否被吸收
      (wcmatch str ns))
      (setq sp (cons g1 sp))
      (progn
      (setq s1 (+ len ad))
      (setq g1 (substr str 1 s1))
      (setq sp (cons g1 sp))
      )
    )
    (setq str (vl-string-subst "" g1 str))
    (setq l1 (strlen str))
)
(if (/= str "")
    (setq sp (Cons str sp))
)
(reverse sp)
)

zxh92 发表于 2023-8-23 09:53:16

6666666666666
页: [1]
查看完整版本: 按字符串长度分割字符串