如何在一个字符串中找到第一个中文字符出现的“位置”

thinclient 2012-09-27 02:46:45
如何在一个字符串中找到第一个中文字符出现的“位置”
也就是
从左向右找,找到第一个中文字符,并返回其出现的位置
...全文
1301 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
kx = '暗示疗法黄蜡石减肥aasd啊飒飒返回'
kx1 = Strconv(kx,1)
kx2 = Bitxor(Cast(kx as W),Cast(kx1 as W))
yy = 1 + Len(kx1) - Len(Ltrim(kx2))
? yy
[/Quote]
可以改成这样:
kx1 = Strconv(Strconv(kx,1),5)
kx2 = Strconv(kx,5)
kx3 = Bitxor(Cast(kx1 as W),Cast(kx2 as W))
yy = At(Chr(0), kx3)
? Int(1+(yy-1)/2)
lyangyong 2012-09-28
  • 打赏
  • 举报
回复
用正则表达式
taohua300 2012-09-28
  • 打赏
  • 举报
回复

kx = '暗示疗法黄蜡石减肥aasd啊飒飒返回'
kx1 = Strconv(kx,1)
kx2 = Bitxor(Cast(kx as W),Cast(kx1 as W))
yy = 1 + Len(kx1) - Len(Ltrim(kx2))
? yy


豆老师
这个代码是查找字符串中第一个单字节字符的位置
即使字符串相当长
速度也非常快
能改成查找第一个双字节字符的位置不 ?
十豆三 2012-09-28
  • 打赏
  • 举报
回复
遍历字符串,然后用 ISLEADBYTE() 函数判断即可。
都市夜猫 2012-09-28
  • 打赏
  • 举报
回复
呵呵,11楼代码有点小问题,应该是
yy = At(Chr(0)+chr(0), kx3)

你 9 楼的代码算法是这样的:
先将字符串全部转换成全角字符,然后比较哪个字符变化了,变化的字符一定原来是半角字符了。

这里反过来,找到第一个没有变化的字符,就首次出现全角的位置。

如果逐一取出来比较那就没意义了,还不如用 IsLeadByte 来得快。而用按位异或函数可以一次就得到结果,因为相同的字符 xor 的结果为 0,这样是或不是 chr(0) 的位置就是相同或不同字符的位置。
taohua300 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:
可以改成这样:
kx1 = Strconv(Strconv(kx,1),5)
kx2 = Strconv(kx,5)
kx3 = Bitxor(Cast(kx1 as W),Cast(kx2 as W))
yy = At(Chr(0), kx3)
? Int(1+(yy-1)/2)
[/Quote]

版主能不能解释一下
taohua300 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:
kx = '暗示疗法黄蜡石减肥aasd啊飒飒返回'
kx1 = Strconv(kx,1)
kx2 = Bitxor(Cast(kx as W),Cast(kx1 as W))
yy = 1 + Len(kx1) - Len(Ltrim(kx2))
? yy

可以改成这样:
kx1 = Strconv(Strconv(kx,1),5)
kx2 = Str……
[/Quote]



超长字符串用这个
速度快的多
lygcw9602 2012-09-27
  • 打赏
  • 举报
回复
?ABC("ABC中国34人民")

FUNCTION ABC
LPARAMETERS LCSTRING
FOR I = 1 TO LENC(LCSTRING)
IF LEN(SUBSTRC(LCSTRING,I,1))=2
EXIT
ENDIF
NEXT
RETURN I
ENDFUNC
taohua300 2012-09-27
  • 打赏
  • 举报
回复
如果字符串不是特别特别长
遍历一下
?abc("abc中国34人民")

Function abc
Lparameters lcString
For i = 1 To Len(lcString)
If Isleadbyte(Substr(lcString,i,1))
Exit
Endif
Next
Return i
Endfunc
thinclient 2012-09-27
  • 打赏
  • 举报
回复
假设我要的函数名称为abc()
?abc("abc中国34人民")
显示:4
?abc("abcd人民")
显示:5



wwwwb 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

谢两位百忙中回复

但是由于我的表达不够清楚,我重述如下:

我是想得到第一个“任意中文符号”出现的位置,不是特定的中文出现的位置
[/Quote]
举例说明
thinclient 2012-09-27
  • 打赏
  • 举报
回复
谢两位百忙中回复

但是由于我的表达不够清楚,我重述如下:

我是想得到第一个“任意中文符号”出现的位置,不是特定的中文出现的位置
lnaszxl 2012-09-27
  • 打赏
  • 举报
回复
a= 'abcdefg回贴 '
? len(a)
显示 10
? lenc(a)
显示 8
if len(a)=lenc(a) then
messagebox( '这个字符串里没有双字节字符! ',0+64, '判断显示 ')
else
messagebox( '这个字符串里有双字节字符! ',0+64, '判断显示 ')
endif
wwwwb 2012-09-27
  • 打赏
  • 举报
回复
参考ATC( )
STORE 'Now is the time for all good men ... ' TO gcString
STORE 'IS THE' TO gcFindString
CLEAR
? ATC(gcFindString, gcString) && Displays 5
STORE 'is' TO gcFindString
? ATC(gcFindString, gcString) && Displays 5
? ATC('now',gcString) && Displays 1

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧