本帖最后由 tryhi 于 2015-10-9 18:59 编辑
大家都知道,由于汉字是双字节字符,所以用strlen跟subst的时候一个汉字当成两个字符计算,有时候我们想要按常规做法(像excel的left公式一样)来处理,这时就容易出错,所以写个子函数来调用
- ;;例子(try-substr "数1数456" 2 3) => "1数4"
- ;;截取字符串,仿substr,但是支持中文
- ;;参数3 nil表示后面全部保留
- (defun try-substr(str start len / lst)
- (setq lst ( _Str2List str))
- (setq lst (try-lst-move-head lst (1- start)))
- (if (not len)nil(setq lst (try-lst-read-head lst len)))
- (apply 'strcat lst)
- )
- ;;例子(try-strlen "数一数123") => 6
- ;;返回一个字符串中的字符数量(支持中文)
- (defun try-strlen(str / i strx)
- (setq i 0)
- (setq strx(vl-string->list str))
- (if (not(= str ""))
- (while
- (if(<(car strx)129)
- (setq i (1+ i) strx(cdr strx))
- (setq i (1+ i) strx(cddr strx))
- )
- )
- )
- i
- )
- ;;字符串拆分为单一的表(支持单双字节混合)
- (defun _Str2List(str / a);注:引用73的函数
- (setq str(vl-string->list str))
- (while
- (if(<(car str)129)
- (setq a(cons(chr(car str))a)str(cdr str))
- (setq a(cons(strcat(chr(car str))(chr(cadr str)))a)str(cddr str))))
- (reverse a)
- )
- (defun try-lst-move-head (lst i)
- (if (<= i 0)lst
- (repeat i (setq lst (cdr lst))))
- )
- (defun try-lst-read-head(lst i / lstt)
- (if (<= i 0)lst
- (progn
- (setq lstt '())
- (repeat i
- (setq lstt (cons (car lst) lstt))
- (setq lst(cdr lst))
- )
- (reverse lstt)
-
- )
- )
- )
|