当前位置: 首页 > news >正文

HarmonyOS ArkTS CharUtil 综合指南:从源码到实战彻底掌握字符检测

文章目录

    • 概述
    • 一、本文目标
    • 二、isSpaceChar vs isWhitespace vs isBlankChar
      • 三者对比
    • 三、isRTL:检测从右到左语言
      • 使用场景
    • 四、isAscii:ASCII 范围检测原理
      • ASCII 范围说明
    • 五、Demo 完整实现:字符信息展示
    • 六、Demo 中 API 列表展示
    • 七、综合实战:多规则文本分析器
    • 八、小结:CharUtil 方法选择策略

概述

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

一、本文目标

前一篇文章讲了CharUtil的常用方法(isDigitisLetter等)和基础校验场景。本篇将深入讲解几个容易被忽视但非常有用的方法:

  • isBlankChar:比isWhitespace更全面的空白字符检测
  • isRTL:检测从右到左书写的语言字符(阿拉伯语/希伯来语)
  • isSpaceCharvsisWhitespace的区别
  • 多字符字符串的逐字符遍历完整实现

二、isSpaceChar vs isWhitespace vs isBlankChar

这三个方法都跟"空白"有关,但范围不同,很多人会混淆:

// CharUtil.ets(工具类源码)// 判断是否为 Unicode 空格符(Unicode 分类为 Zs 的字符)staticisSpaceChar(char:string):boolean{returni18n.Unicode.isSpaceChar(char);}// 判断是否为空白符(包含 Unicode 分类 Zs + 制表符 \t 等控制字符)staticisWhitespace(char:string):boolean{returni18n.Unicode.isWhitespace(char);}// 判断是否为广义空白符(空格、制表符、全角空格和不间断空格)staticisBlankChar(c:number):boolean{returnCharUtil.isWhitespace(c.toString())||CharUtil.isSpaceChar(c.toString())||c===0xFEFF// BOM(字节顺序标记)||c===0x202A// 从左到右嵌入控制字符||c===0x0000;// NULL 字符}

三者对比

字符Unicode 码点isSpaceCharisWhitespaceisBlankChar
普通空格U+0020
制表符\tU+0009
换行符\nU+000A
全角空格U+3000
不间断空格U+00A0
BOMU+FEFF
NULLU+0000

关键结论

  • isSpaceChar:Unicode 分类为"空格符"(Zs)的字符,重点是空格类
  • isWhitespace:Java/Unicode 标准的空白符,包含制表符/换行等控制字符
  • isBlankChar:最全面,额外覆盖 BOM、不间断空格等特殊字符

实际使用建议

  • 用于输入框去空格校验 → 用isWhitespace
  • 用于文本解析(去除所有空白类字符)→ 用isBlankChar
  • 特别注意:isBlankChar的参数是数字 charCode,不是字符串
// isBlankChar 的正确使用方式constchar=' ';// 普通空格constisBlank=CharUtil.isBlankChar(char.charCodeAt(0));// 传入 charCodeconsole.log(isBlank);// true// 检测字符串是否全为空白functionisAllBlank(str:string):boolean{for(leti=0;i<str.length;i++){if(!CharUtil.isBlankChar(str.charCodeAt(i))){returnfalse;}}returntrue;}

三、isRTL:检测从右到左语言

RTL(Right-To-Left)指阿拉伯语、希伯来语、波斯语等从右向左书写的语言。在多语言国际化应用中,需要识别这类字符:

// CharUtil.ets(工具类源码)staticisRTL(char:string):boolean{returni18n.Unicode.isRTL(char);}

使用场景

// 检测字符串中是否包含 RTL 字符functioncontainsRTL(text:string):boolean{for(leti=0;i<text.length;i++){if(CharUtil.isRTL(text.charAt(i))){returntrue;}}returnfalse;}// 统计文本中 RTL 字符的比例functiongetRTLRatio(text:string):number{letrtlCount=0;for(leti=0;i<text.length;i++){if(CharUtil.isRTL(text.charAt(i)))rtlCount++;}returnrtlCount/text.length;}

四、isAscii:ASCII 范围检测原理

// CharUtil.ets(工具类源码)staticisAscii(char:string):boolean{if(char.length===1){// 确保输入的是单个字符returnchar.charCodeAt(0)<128;}else{returnfalse;}}

ASCII 范围说明

范围含义
0 - 31控制字符(不可见,如\n=10,\t=9)
32 - 126可见 ASCII 字符(空格、字母、数字、标点)
127DEL 删除控制字符
≥ 128非 ASCII(中文、日文、特殊符号等)
// 典型测试CharUtil.isAscii('A');// true (charCode=65)CharUtil.isAscii('z');// true (charCode=122)CharUtil.isAscii('0');// true (charCode=48)CharUtil.isAscii('!');// true (charCode=33)CharUtil.isAscii('中');// false (charCode=20013)CharUtil.isAscii('AB');// false (多字符返回 false)

五、Demo 完整实现:字符信息展示

以下是 Demo(CacheCharClickDemoPage.ets)中展示字符 Unicode 码点信息的完整代码:

// 展示每个字符的 Unicode 码点和检测结果ForEach(this.charResults,(cr:CharCheckResult)=>{Column(){Row(){Text(`"${cr.char}"`).fontSize(20).fontWeight(FontWeight.Bold).fontColor('#1a1a1a')// 显示 Unicode 码点(如 U+4E2D 表示"中")Text(`U+${cr.char.charCodeAt(0).toString(16).toUpperCase().padStart(4,'0')}`).fontSize(11).fontColor('#AAA').margin({left:8}).fontFamily('monospace')Blank()// 综合分类结果Text(this.getCharType(cr.char)).fontSize(12).fontColor('#4080FF').fontWeight(FontWeight.Medium)}.width('100%').margin({bottom:6})// 每个检测方法的结果,用绿色/灰色区分Flex({wrap:FlexWrap.Wrap}){ForEach(cr.results,(r:CharResultItem)=>{Column(){Text(r.label).fontSize(10).fontColor(r.result?'#FFF':'#AAA')Text(r.result?'✅':'❌').fontSize(13).fontColor(r.result?'#FFF':'#CCC')}.padding({top:4,bottom:4,left:8,right:8}).backgroundColor(r.result?'#00C853':'#F0F0F0').borderRadius(6).margin({right:6,bottom:4})},(r:CharResultItem)=>r.method)}}.width('100%').padding(10).backgroundColor('#F5F6FA').borderRadius(8).margin({bottom:6})},(cr:CharCheckResult)=>cr.char)

注意cr.char.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')这段代码将字符转换为 4 位十六进制 Unicode 码点,这是国际通用的字符标识方式(如 U+0041 表示大写字母 A)。

六、Demo 中 API 列表展示

// Demo 中用于展示所有 API 的数据getCharApiList():CharApiItem[]{return[{name:'isDigit(ch)',desc:'判断是否为数字 0-9'},{name:'isLetter(ch)',desc:'判断是否为字母(含中文)'},{name:'isLowerCase(ch)',desc:'判断是否为小写字母'},{name:'isUpperCase(ch)',desc:'判断是否为大写字母'},{name:'isSpaceChar(ch)',desc:'判断是否为空格符'},{name:'isWhitespace(ch)',desc:'判断是否为空白符'},{name:'isAscii(ch)',desc:'判断是否在 ASCII 范围内 (<128)'},{name:'isIdeograph(ch)',desc:'判断是否为表意文字(汉字)'},{name:'isRTL(ch)',desc:'判断是否为从右到左语言字符'},{name:'isBlankChar(code)',desc:'判断是否为空白符(含制表符等)'},];}

七、综合实战:多规则文本分析器

interfaceTextAnalysis{total:number;// 总字符数digits:number;// 数字字符数letters:number;// 字母数(含汉字)ideographs:number;// 表意文字(汉字/日文等)blanks:number;// 空白字符数ascii:number;// ASCII 字符数rtl:number;// RTL 字符数others:number;// 其他字符数}functionanalyzeText(text:string):TextAnalysis{constresult:TextAnalysis={total:text.length,digits:0,letters:0,ideographs:0,blanks:0,ascii:0,rtl:0,others:0};for(leti=0;i<text.length;i++){constch=text.charAt(i);constcode=text.charCodeAt(i);if(CharUtil.isDigit(ch))result.digits++;elseif(CharUtil.isIdeograph(ch)){result.ideographs++;result.letters++;}elseif(CharUtil.isLetter(ch))result.letters++;elseif(CharUtil.isBlankChar(code))result.blanks++;elseif(CharUtil.isRTL(ch))result.rtl++;elseif(CharUtil.isAscii(ch))result.ascii++;elseresult.others++;}returnresult;}// 使用示例constanalysis=analyzeText('Hello 世界123!');// { total: 11, digits: 3, letters: 7, ideographs: 2, blanks: 1, ascii: 5, rtl: 0, others: 1 }

八、小结:CharUtil 方法选择策略

场景推荐方法
验证输入只含数字isDigit
验证输入只含英文字母isLetter && isAscii
验证是否包含汉字isIdeograph
去除首尾空白isWhitespaceisBlankChar
国际化应用检测文字方向isRTL
过滤特殊不可见字符isBlankChar(含 BOM 等)
密码强度检测isUpperCase+isLowerCase+isDigit组合
http://www.jsqmd.com/news/872174/

相关文章:

  • 3个技巧让你的Windows B站体验超越浏览器:第三方UWP客户端深度解析
  • 对比直接使用厂商API在Taotoken上聚合调用的便利性
  • 初次在Taotoken模型广场选型与测试不同模型的实际流程
  • PDF怎么免费转Word?2026年在线工具与软件推荐对比 - AI测评专家
  • Caldroid与其他日历库对比:为什么它是Android开发的最佳选择
  • PDF怎么转换最方便?2026年免费工具对比与推荐指南 - AI测评专家
  • 颠覆性开源PLC编程革命:OpenPLC Editor一站式工业自动化解决方案
  • 重庆黄金回收迎高峰!50克黄金差价竟抵一部手机,7店实测榜单发布 - 润富黄金珠宝行
  • AutoWall完全指南:打造个性化动态桌面的终极方案
  • 书匠策AI降重降AIGC实测:论文过关的“地下通道“|官网www.shujiangce.com别错过
  • 2026年GEO优化是什么意思?中小企业如何抓住AI搜索红利 - 品牌报告
  • 初次使用Taotoken Token Plan套餐的体验与注意事项
  • RedTeamTools之Mimikatz绕过技术:mimikatz.py与mimikatz2.py脚本深度解析
  • UI-TARS桌面版:5个技巧掌握智能GUI自动化新范式
  • 学位论文质量护航!2026智能AI论文平台推荐指南
  • 海南注册公司哪家代办机构专业靠谱? 2026 年最新优质财税代办TOP4机构实测推荐 - 速递信息
  • React Icons 技术架构深度解析:现代前端图标解决方案的设计与实践
  • VMware Workstation Pro 17 免费许可证密钥:轻松获取与激活完整指南
  • 初创团队如何借助Taotoken统一管理API密钥与访问权限
  • Hotkey Detective:3分钟找出Windows热键冲突的终极指南
  • Taotoken控制台功能导览从注册到查看账单的全流程体验
  • 杭州西装定制不踩雷五大专业店铺权威指南 - 西装爱好者
  • 惠州黄金回收哪家靠谱?惠城区老店领衔全城连锁,就近到店全域上门,正规实体无套路 - 润富黄金珠宝行
  • AI论文软件的合规指南:什么程度算学术不端?
  • 独立开发者如何借助Taotoken模型广场为项目选型合适大模型
  • 歌词滚动姬:三步搞定专业级歌词制作,让音乐创作更简单
  • 2026年沈阳黄金回收S/A/B级排行榜,福昌夏稳居S级首选 - 黄金上门回收
  • Windows 11系统清理终极指南:3分钟告别卡顿与隐私泄露
  • 2026年度中国企业官网建设服务商综合测评报告:十家头部建站公司谁更值得选? - 资讯纵览
  • 5个步骤解锁AI编程助手:cursor-vip完全配置指南