yxp 发表于 2013-6-13 16:37:38

求助 vl-string-search 查汉字

vl-string-search 查带有汉字的字符串时,位置不对,该函数将一个汉字视为两个字符。
如何能反回真实位置?
(vl-string-search "人" "中国人民") 返回4,如何能返回2 ?

陨落 发表于 2013-6-13 16:42:50

为什么不除2

cnks 发表于 2013-6-13 17:21:51

陨落 发表于 2013-6-13 16:42 static/image/common/back.gif
为什么不除2

如果前两个不是汉子呢?

Gu_xl 发表于 2013-6-13 17:46:56

用正则表达式吧!

陨落 发表于 2013-6-13 17:53:51

cnks 发表于 2013-6-13 17:21 static/image/common/back.gif
如果前两个不是汉子呢?

应该是可以解决的,比如说:用vl-string-search查找到该汉字的位置,然后对该位置之前位置上的字符逐个检查,统计出汉字的个数,然后将原位置的数字减去汉字个数应该就能得到想要的结果了吧

masterlong 发表于 2013-6-13 17:54:21

返回值正确的很呀
难道返回2才叫对吗
真返回2的话
你要截取“人”这个字的时候
岂不是要把人之前的所有字符都判断一遍是否大字符?

自贡黄明儒 发表于 2013-6-13 20:48:04

Gu_xl 发表于 2013-6-13 17:46
用正则表达式吧!

赞同G版观点,可能正则表式好搞些

xiaxiang 发表于 2013-6-13 21:21:18

将字符串转换为字符表,然后判断字符在表中的位置

namezg 发表于 2013-6-13 22:50:23

本帖最后由 namezg 于 2013-6-13 22:53 编辑

刚写了一个,试试有没有问题?

;功能:在字符串中搜索指定子串,区分大小写,支持双字节字符(视为一个字符)
;参数:pattern--字符串,包含要搜索的子串。
;      string--字符串,在其中搜索 pattern。
;      start-pos--整数型,表示搜索的开始位置。缺省值为 0。
;返回值:整数,表示找到指定 pattern 的位置。如果未找到子串,则返回 nil。字符串第一个字符的位置为 0。
;示例:
;(zg-string-search "人" "中国人民Sad人abd" 0)
;(zg-string-search "人" "中国人民Sad人abd" 4)
;(zg-string-search "共" "中国人民Sad人abd" 0)
;(zg-string-search "人" "中国人民Sad人abd" 8)
(defun zg-string-search (pattern str start-pos / i j value tmp_str)
      (setq i 0)
      (setq j 0)
      (while (and (< i (strlen str)) (not value))
                (setq tmp_str (substr str (setq i (1+ i)) 1))
                (if (> (ascii tmp_str) 128);用于判断是不是遇到了双字节字符
                        (progn
                              (setq tmp_str (substr str i 2))
                              (setq i (+ i 1))
                        )
                )
                (if (and (= tmp_str pattern) (>= j start-pos))
                        (setq value j)
                )
                (setq j (1+ j))
      )
      value
)

yxp 发表于 2013-6-14 15:32:11

谢谢各位! namezg
查找汉字法比较简单,正则还不会。

Opendcl 控件 textbox 的 setsel 定位是按字符定位的,不分汉字和字母,所以会出现这个问题。

页: [1]
查看完整版本: 求助 vl-string-search 查汉字