当前位置: 首页 > 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.zskr.cn/news/1358006.html

相关文章:

  • 在自动化测试脚本中集成多模型调用以提升用例覆盖与稳定性
  • AD0808调试笔记
  • Vue Antd Admin布局系统:5分钟掌握企业级后台界面设计
  • 颠覆性开源PLC编程革命:OpenPLC Editor一站式工业自动化解决方案
  • PDF怎么转换最方便?2026年免费工具对比与推荐指南 - AI测评专家
  • 企业如何利用Taotoken统一管理多个AI项目的API成本
  • AI入门先选语言?别急,先看懂这个坑
  • RedTeamTools之Mimikatz绕过技术:mimikatz.py与mimikatz2.py脚本深度解析
  • 学位论文质量护航!2026智能AI论文平台推荐指南
  • React Icons 技术架构深度解析:现代前端图标解决方案的设计与实践
  • 海南注册公司哪家代办机构专业靠谱? 2026 年最新优质财税代办TOP4机构实测推荐 - 速递信息
  • 为内部知识库问答系统接入Taotoken,实现灵活的多模型回复与成本分摊
  • Taotoken控制台功能导览从注册到查看账单的全流程体验
  • 惠州黄金回收哪家靠谱?惠城区老店领衔全城连锁,就近到店全域上门,正规实体无套路 - 润富黄金珠宝行
  • Hermes Agent项目如何接入Taotoken作为自定义模型提供商
  • openpilot自动驾驶系统深度解析:从架构原理到300+车型适配实战
  • 5个步骤解锁AI编程助手:cursor-vip完全配置指南
  • 2026丽江旅拍婚纱照公司头部玩家盘点:选型参考 - 速递信息
  • 强力填充:3分钟掌握Illustrator智能填充脚本Fillinger终极指南
  • 武汉黄金回收高价实测哪家到手价更高避坑指南,余生领先 - 润富黄金珠宝行
  • 刮泥机厂家破局之路:深度解析3C全链路定制方法论 - 速递信息
  • 通过Taotoken接入Claude Code解决编程助手Token不足与封号困扰
  • calendar.js:如何在3分钟内为你的应用添加完整的农历转换功能
  • 资源下载神器:5分钟掌握全平台媒体内容下载技巧
  • Jupyter C内核:在Notebook中实现C语言交互式编程的完整指南
  • token plan套餐如何帮助个人开发者显著降低使用成本
  • 拉泽替尼Lazertinib对比奥希替尼治疗EGFR T790M阳性非小细胞肺癌的副作用如何?
  • 热风枪拆卸隔热垫
  • 5G NR中QC-LDPC分层解码器的内存冲突优化策略
  • 智能茅台预约系统:基于Spring Boot的自动化解决方案深度解析