| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 2540 人关注过本帖
标题:判断一个字符是否纯汉字(非标点符号、英数等)的函数
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:557
专家分:380
注 册:2013-10-4
收藏
得分:0 
之前我一直把 0hB6AA 当作是有些特殊的字符串,Deepseek提醒说,它是 Varbinary 类型(二进制数据),这引起了我的兴趣。一直以来,都希望能像C语言那样,可随时将字符当作数值那样处理,也就是将 0hB6AA 与 0xB6AA 互换着玩。这下子,Varbinary 类型似乎满足了我的需求!嘿嘿。
2025-11-18 09:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
回复 21楼 cssnet
车天車地也不知与“纯汉字”有什么关系?
2025-11-18 11:49
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:557
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-11-18 11:49:54的发言:

车天車地也不知与“纯汉字”有什么关系?


当然有关系!让我们换一种“类C”方式重写一下顶楼的“UTF-8编码汉字判断函数”:

* UTF-8编码汉字判断
FUNCTION IsUTF8Chinese(tcChar)
LOCAL lnByte1, lnByte2, lnByte3, lnLen, lnUnicode

lcUnicodeLE = strconv(tcChar, 12)    && 将 UTF-8 转换为 Unicode
lcUnicodeBE = substr(lcUnicodeLE, 2, 1) + LEFT(lcUnicodeLE, 1)
lcUnicodeBE = STRCONV(lcUnicodeBE, 15)
lnUnicodeBE = EVALUATE("0x" + lcUnicodeBE)
RETURN (lnUnicodeBE >= 0x4E00 AND lnUnicodeBE <= 0x9FFF)
ENDFUNC

因VFP的 Unicode 转换结果是小端序,需高低位对调。

[此贴子已经被作者于2025-11-19 15:15编辑过]

2025-11-18 14:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
回复 23楼 cssnet
UTF-16核心编码 0x4E00 ~ 0x9FFF,不考虑UTF-16扩展编码?
2025-11-18 20:25
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
以下是引用cssnet在2025-11-17 23:35:01的发言:

UNICODE = STRCONV(ANSI, 5)
Hex = STRCONV(UNICODE, 15)
? Hex   && 返回:224E

最后一个 UNICODE 的转换比较晕!因"丢"的Unicode编码是U+4E22,这大尾、小尾搞得人很迷糊;而前边两个倒是符合日常使用习惯的。

STRCONV()出来的是机内码 0h224E,U+4E22 是 0x4E22
? STRCONV(0h224E,6)
? STRCONV(BINTOC(0x4E22,"2rs"),6)

2025-11-18 20:55
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:557
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-11-18 20:55:18的发言:
STRCONV()出来的是机内码 0h224E,U+4E22 是 0x4E22
? STRCONV(0h224E,6)
? STRCONV(BINTOC(0x4E22,"2rs"),6)


之所以在意这个大端序、小端序,只因 VFP 的 IDE 无法直接显示 Unicode 字符,软件调试时,只能在调试窗口监视其编码的字面值;而小端序我永远反应不过来,永远没办法第一反应直接将224E与“丢”对应起来,4E22才容易对应上。
这也是我只爱 UTF-8 的原因。
UTF-8 无歧义,无混乱,是全宇宙最最最最伟大的字符编码!
——不接受反驳。

2025-11-18 21:11
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:557
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-11-18 20:25:22的发言:

UTF-16核心编码 0x4E00 ~ 0x9FFF,不考虑UTF-16扩展编码?


不考虑。
只考虑 USC-2 子集。
前边看你建议将 UTF-8 转 ANSI,那个子集其实更小哇!
STRCONV(x, 6) 和 STRCONV(x, 11),其实是不那么安全的,一不留神就可能转换出??。

2025-11-18 21:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
回复 27楼 cssnet
那就是只考虑 UTF-16 核心编码 0x4E00 ~ 0x9FFF
这样是不是可以直接用 UTF-8 机内码 0hE4B880~0hE9BFBF 判断就可以?

* UTF-8编码汉字判断
FUNCTION IsUTF8Chinese(tcChar)
    RETURN BETWEEN(tcChar,0hE4B880,0hE9BFBF)    && 假设tcChar是3字节UTF-8字符
ENDFUNC
2025-11-18 23:40
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:557
专家分:380
注 册:2013-10-4
收藏
得分:0 
以下是引用吹水佬在2025-11-18 23:40:19的发言:

那就是只考虑 UTF-16 核心编码 0x4E00 ~ 0x9FFF
这样是不是可以直接用 UTF-8 机内码 0hE4B880~0hE9BFBF 判断就可以?

* UTF-8编码汉字判断
FUNCTION IsUTF8Chinese(tcChar)
    RETURN BETWEEN(tcChar,0hE4B880,0hE9BFBF)    && 假设tcChar是3字节UTF-8字符
ENDFUNC


这个……直觉可能不太安全?
1110xxxx
10xxxxxx
10xxxxxx
这种掩码模式,当中存在大量无效缺码,如此简单粗暴比较,心中不太有底气……
另,很重要的一点:
lcUnicodeLE = strconv(tcChar, 12) 将utf-8 转换至 unicode ,不是脱裤子放P,其主要副作用是,自动验证utf-8字符参数的有效性——若自己写,需逐字节验证掩码,代码挺繁琐的。

[此贴子已经被作者于2025-11-19 07:23编辑过]

2025-11-19 01:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10919
专家分:43569
注 册:2014-5-20
收藏
得分:0 
以下是引用cssnet在2025-11-19 01:20:05的发言:



这个……直觉可能不太安全?
1110xxxx
10xxxxxx
10xxxxxx
这种掩码模式,当中存在大量无效缺码,如此简单粗暴比较,心中不太有底气……
另,很重要的一点:
lcUnicodeLE = strconv(tcChar, 12) 将utf-8 转换至 unicode ,不是脱裤子放P,其主要副作用是,自动验证utf-8字符参数的有效性——若自己写,需逐字节验证掩码,代码挺繁琐的。

RETURN (lnUnicodeBE >= 0x4E00 AND lnUnicodeBE <= 0x9FFF)
RETURN BETWEEN(tcChar,0hE4B880,0hE9BFBF)
这两句有本质上的差别吗?



2025-11-19 09:52
快速回复:判断一个字符是否纯汉字(非标点符号、英数等)的函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018962 second(s), 10 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved