明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 561|回复: 7

[函数] 字符串转表[支持中文]

[复制链接]
发表于 2024-5-22 11:27 | 显示全部楼层 |阅读模式
->任意字符串转表:
;;输入:任意字符串
;;输出:列表
(defun cl-string->list (string / lst lst1 nn n m)
        (setq nn (strlen string) n 0 m 1)
        (repeat nn
                (setq n (1+ n) lst (vl-string->list (substr string n m)))
                (if (vl-remove-if '(lambda (x) (< x 128)) lst)
                        (progn
                                (if (= (length lst) 2)
                                        (progn
                                                (setq lst1 (cons (vl-list->string lst) lst1))
                                                (if (= m 2) (setq n (1+ n) m 1))
                                        )
                                        (progn
                                                (setq n (1- n) m 2)
                                        )
                                )
                        )
                        (progn
                                (setq lst1 (cons (vl-list->string lst) lst1))
                        )
                )
        )
        (reverse lst1)
)
->用法示例:
(defun c:pp ()
        (cl-string->list "#$%文字@789")
)
;;返回:("#" "$" "%" "文" "字" "@" "7" "8" "9")

评分

参与人数 2明经币 +2 收起 理由
飞雪神光 + 1
tryhi + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-5-22 11:42 | 显示全部楼层
我觉得LLSheng_73这个函数写得挺好
  1. ;;字符串拆分为单一的表(支持单双字节混合)
  2. (defun _Str2List(str / a);作者:LLSheng_73
  3.         (setq str(vl-string->list str))
  4.         (while
  5.                 (if(<(car str)129)
  6.                         (setq a(cons(chr(car str))a)str(cdr str))
  7.                         (setq a(cons(strcat(chr(car str))(chr(cadr str)))a)str(cddr str))))
  8.         (reverse a)
  9. )

点评

129也许改为127更好  发表于 2024-5-22 22:34
发表于 2024-5-22 12:09 | 显示全部楼层
  1. ;;字符串转表,中英文拆分为单独文字表-----(一级)------
  2. ;;(sl-str->singleonly "12我 的\n三领设计#$%文字@789")  ("1" "2" "我" " " "的" "\n" "三" "领" "设" "计")
  3. (defun sl-str->singleonly (str / strlst strlst1 hz_str num)
  4.   (setq  strlst (vl-string->list str) strlst1 '())
  5.   (while strlst
  6.     (setq num (car strlst))
  7.     (cond
  8.       ((and (not hz_str) (> num 159))
  9.         (setq hz_str (list num))
  10.       )
  11.       ((and hz_str (> num 159))
  12.         (setq hz_str (append hz_str (list num)))
  13.         (setq strlst1 (append strlst1 (list hz_str)) hz_str nil)
  14.       )
  15.       ((< num 159)
  16.         (setq hz_str nil)
  17.         (if strlst1
  18.           (setq strlst1 (append strlst1 (list (list num))))
  19.           (setq strlst1 (list (list num)))
  20.         )
  21.       )
  22.     )
  23.     (setq strlst (cdr strlst))
  24.   )
  25.   (mapcar 'vl-list->string strlst1)
  26. )
  27. ;;字符串转表,中英文拆分为单独文字表-----(一级)------
  28. ;(cl-string->list "12我 的\n三领设计#$%文字@789")
  29. (defun cl-string->list (string / lst lst1 nn n m)
  30.   (setq nn (strlen string) n 0 m 1)
  31.   (repeat nn
  32.     (setq n (1+ n) lst (vl-string->list (substr string n m)))
  33.     (if (vl-remove-if '(lambda (x) (< x 128)) lst)
  34.       (progn
  35.         (if (= (length lst) 2)
  36.           (progn
  37.             (setq lst1 (cons (vl-list->string lst) lst1))
  38.             (if (= m 2) (setq n (1+ n) m 1))
  39.           )
  40.           (setq n (1- n) m 2)
  41.         )
  42.       )
  43.       (setq lst1 (cons (vl-list->string lst) lst1))
  44.     )
  45.   )
  46.   (reverse lst1)
  47. )
  48. ;;字符串转表,中英文拆分为单独文字表-----(一级)------
  49. ;(_Str2List "12我 的\n三领设计#$%文字@789")
  50. (defun _Str2List (str / a);作者:LLSheng_73
  51.   (setq str (vl-string->list str))
  52.   (while
  53.     (if (< (car str) 129)
  54.       (setq a (cons (chr (car str)) a) str (cdr str))
  55.       (setq a (cons (strcat (chr (car str)) (chr (cadr str))) a) str (cddr str))
  56.     )
  57.   )
  58.   (reverse a)
  59. )


发表于 2024-5-22 13:24 | 显示全部楼层
正则表达式用"."就行
发表于 2024-5-23 08:35 | 显示全部楼层
(defun c:tes ( / a1 opn ss1 tr1)
(setq a1 "中文2024");举例
(if (cadr (vl-string->list "中")) (setq opn nil) (setq opn t) );判断中文是1个还是2个字节
(setq ss1 '())
(while (/= a1 "")
  (cond
   (opn
    (setq tr1 (substr a1 1 1) a1 (substr a1 2));中文与英文结合都是一个字节cad2024版本
   )
   (t
    (if (> (ascii (substr a1 1 1)) 128)
     (setq tr1 (substr a1 1 2) a1 (substr a1 3))
     (setq tr1 (substr a1 1 1) a1 (substr a1 2))
    )
   )
  )
  (setq ss1 (cons tr1 ss1))
);while
  (reverse ss1);字串符变表->("中" "文" "2" "0" "2" "4")
)
发表于 2024-5-23 09:35 | 显示全部楼层
大哥字符串转表示啥意思
发表于 2024-5-23 10:26 | 显示全部楼层
改 utf-8 编码,就不用再去判断双字节字符了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-16 05:01 , Processed in 0.157269 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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