注册 登录
编程论坛 VFP论坛

求:如何判断中、英文标点符号?

cssnet 发布于 2022-11-09 12:35, 2165 次点击
比方说,下边这一行字符串:

[这是中文标点“、”,That is 英文标点“;”,那么这个"This's a book."呢?]

混杂了中、英文的字符,扫描这一行字符串,如何判断第N个字符,是否标点符号?
17 回复
#2
吹水佬2022-11-09 14:32
处理字符串的函数名尾带“C”的可以吧
#3
csyx2022-11-09 15:09
程序代码:
cc = [这是中文标点“、”,That is 英文标点“;”,那么这个"This's a book."呢?]
For ii = 1 to Lenc(cc)
    c1 = Substrc(cc, ii, 1)
    c2 = Strconv(c1, 1)
    Do case
    Case Empty(c1)
        *-- 空格, TAB, 回车, 换行, 行进 字符
    Case c1 == c2
        If Strconv(c2, 2) == c1
            *--中文字符'
        Else
            ? ii, '全角符号', c1
        EndIf
    Otherwise
        If Between(c1, 'A','Z') or Between(c1, 'a','z')
            *-- 英文字符
        Else
            ? ii, '半角符号', c1
        EndIf
    EndCase
EndFor



[此贴子已经被作者于2022-11-9 15:16编辑过]

#4
吹水佬2022-11-09 15:24
程序代码:
ccc = [这是中文标点“、”,That is 英文标点“;”,那么这个"This's a book."呢?]
FOR i=1 TO LENC(ccc)
    cc = SUBSTRC(ccc,i,1)
    ? cc,IIF(LEN(cc)==1,"单","双")
ENDFOR
#5
cssnet2022-11-09 16:58
厉害啦!真想不到Strconv()还有这妙用!


以下是引用csyx在2022-11-9 15:09:05的发言:

cc = [这是中文标点“、”,That is 英文标点“;”,那么这个"This's a book."呢?]
For ii = 1 to Lenc(cc)
    c1 = Substrc(cc, ii, 1)
    c2 = Strconv(c1, 1)
    Do case
    Case Empty(c1)
        *-- 空格, TAB, 回车, 换行, 行进 字符
    Case c1 == c2
        If Strconv(c2, 2) == c1
            *--中文字符'
        Else
            ? ii, '全角符号', c1
        EndIf
    Otherwise
        If Between(c1, 'A','Z') or Between(c1, 'a','z')
            *-- 英文字符
        Else
            ? ii, '半角符号', c1
        EndIf
    EndCase
EndFor

#6
schtg2022-11-10 06:47
学习啦,谢谢!
#7
cssnet2022-12-17 19:08
这个函数可能有问题,随便拿几个全角标点符号测试了一下,“—”和“·”判断失误,其他的暂未仔细测试。

以下是引用csyx在2022-11-9 15:09:05的发言:

function isSymbol(cc)
*cc = [这是中文标点“——”和“·”,“、”,That is 英文标点“;”,那么这个"This's a book."呢?]
For ii = 1 to Lenc(cc)
    c1 = Substrc(cc, ii, 1)
    c2 = Strconv(c1, 1)
    Do case
    Case Empty(c1)
        *-- 空格, TAB, 回车, 换行, 行进 字符
    return .t.
    Case c1 == c2
        If Strconv(c2, 2) == c1
            *--中文字符'
        return .f.
        Else
            ? ii, '全角符号', c1
        return .t.
        EndIf
    Otherwise
        If Between(c1, 'A','Z') or Between(c1, 'a','z')
            *-- 英文字符
        return .f.
        Else
            ? ii, '半角符号', c1
        return .t.
        EndIf
    EndCase
EndFor

#8
吹水佬2022-12-17 20:26
通常可打印的符号没几个,用个码表查好了。
#9
cssnet2022-12-17 21:44
以下是引用吹水佬在2022-12-17 20:26:20的发言:
通常可打印的符号没几个,用个码表查好了。


若想一网打尽的话,狠多,多到数唔晒(数不清)——

— ︱ ︵ ︶ ˉ ﹕ \ ﹏ ‖
……
……

狠难狠难穷举的。
#10
吹水佬2022-12-17 22:58
以下是引用cssnet在2022-12-17 21:44:15的发言:



若想一网打尽的话,狠多,多到数唔晒(数不清)——

— ︱ ︵ ︶ ˉ ﹕ \ ﹏ ‖
……
……

狠难狠难穷举的。

这样子还用分吗,有区分吗,都是“字”。所以,只有“单”或“双”之分,并没有什么“点”或“符”之分了。

[此贴子已经被作者于2022-12-17 23:00编辑过]

#11
吹水佬2022-12-17 23:02
如果是标准字库编码,字或符是有区位定义。
#12
cssnet2022-12-18 09:23
以下是引用吹水佬在2022-12-17 23:02:16的发言:
如果是标准字库编码,字或符是有区位定义。


确实是搞复杂了,呵呵,用区位比较简单。
另,#3的代码,英文符号也有漏洞,“\”(0h5C)这个符号,居然成功混过了这一句代码:
*设c1 = "\"
c2 = Strconv(c1, 1)
? c2 == c1
#13
吹水佬2022-12-18 09:29
标准字库本身就有规范,直接查表就可以。
简单写个GB2312-80标准的
只有本站会员才能查看附件,请 登录

程序代码:

hzs = "汉#字¥啊%挨&鼾、尊。昨℃匾$鼽│左┃卦┄阿┅鼹"
FOR i=1 TO LENC(hzs)
    hz = SUBSTRC(hzs,i,1)
    ? " ", hz, hzqm(hz)
ENDFOR
RETURN

FUNCTION hzqm(hz)
    LOCAL qm
    qm = BITRSHIFT(ASC(hz)-0xA0A0,8)
    RETURN ICASE(BETWEEN(qm, 1, 9),"符号",;
                 BETWEEN(qm,16,55),"一级汉字",;
                 BETWEEN(qm,56,87),"二级汉字",;
                 "非标码")
   
ENDFUNC
#14
sdta2022-12-18 10:04
回复 13楼 吹水佬
妙招,高人啊
#15
cssnet2022-12-18 10:29
弊就弊在,时光匆匆流转到了2022年,作为一群真的猛士,我们每天需直接面对、需直接处理的字符串,绝大多数是UTF-8、Unicode LE、Unicode BE啊,亲!
光用硬编码对付GB2312-80、GBK,那可不成啊,亲!
还必须做到能够妥善处理Strconv(x, 6)='??'的那一堆千奇百怪的偏僻字符啊,亲!


以下是引用吹水佬在2022-12-18 09:29:58的发言:

标准字库本身就有规范,直接查表就可以。
简单写个GB2312-80标准的


#16
cssnet2022-12-18 10:53
考虑到,今时今日,在这个星球上,几乎一切网页、一切文档,字符串皆采用UTF-8编码,这已经是事实上的“行业标准”了!——无论VFPer喜欢也罢,诅咒也罢,无奈也罢,接受也罢,敌视也罢——故而,字符串相关处理函数的编程开发,若能够直接针对UTF-8编码进行处理,我相信,那必然会是性价比最高的代码开发了。

你说呢,亲?
#17
吹水佬2022-12-18 11:53
字符编码都可以互转的
VFP的Strconv()也绝对没问题
问题是VFP自身输出的兼容问题,看到的不等于实际的,??也就是编码不在兼容之内,有人叫他“乱码”。
要用UTF-8,VFP也可以找个支持兼容编码控件来处理,这不是什么大的问题。
#18
吹水佬2022-12-19 17:45
以下是引用cssnet在2022-12-18 10:53:41的发言:

考虑到,今时今日,在这个星球上,几乎一切网页、一切文档,字符串皆采用UTF-8编码,这已经是事实上的“行业标准”了!——无论VFPer喜欢也罢,诅咒也罢,无奈也罢,接受也罢,敌视也罢——故而,字符串相关处理函数的编程开发,若能够直接针对UTF-8编码进行处理,我相信,那必然会是性价比最高的代码开发了。

你说呢,亲?

VFP作为桌面数据库应用涉及UTF-8的不多,但作为windows平台的应用,应该也能利用windows的功能应付UTF-8的应用吧。
试了一下,VFP也可以直接编辑web页面的。
只有本站会员才能查看附件,请 登录
1