HarmonyOS ArkTS CharUtil 实战:输入校验与字符分类
文章目录背景一、为什么需要字符级别的判断二、CharUtil 全部方法详解方法速查表三、Demo 演示多字符实时检测3.1 核心检测函数3.2 字符综合分类3.3 UI 展示部分四、实战校验场景场景 1手机号校验纯数字场景 2密码强度检测场景 3过滤非 ASCII 字符五、isLetter vs isIdeograph 的区别六、小结背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓一、为什么需要字符级别的判断在表单校验、文本过滤、内容审核等场景中经常需要逐字符判断类型。例如手机号只允许数字 → 用isDigit用户名只允许字母 → 用isLetter密码强度校验含大写 小写 数字→ 组合多个方法识别输入是否包含中文 → 用isIdeographCharUtil封装了 HarmonyOSi18n.Unicode的能力让这些判断变得极其简单。二、CharUtil 全部方法详解// CharUtil.ets工具类源码import{i18n}fromkit.LocalizationKit;exportclassCharUtil{// 判断字符串char是否是数字staticisDigit(char:string):boolean{returni18n.Unicode.isDigit(char);}// 判断字符串char是否是字母staticisLetter(char:string):boolean{returni18n.Unicode.isLetter(char);}// 判断字符串char是否是小写字母staticisLowerCase(char:string):boolean{returni18n.Unicode.isLowerCase(char);}// 判断字符串char是否是大写字母staticisUpperCase(char:string):boolean{returni18n.Unicode.isUpperCase(char);}// 判断字符串char是否是空格符staticisSpaceChar(char:string):boolean{returni18n.Unicode.isSpaceChar(char);}// 判断字符串char是否是空白符staticisWhitespace(char:string):boolean{returni18n.Unicode.isWhitespace(char);}// 判断字符串char是否是从右到左语言的字符staticisRTL(char:string):boolean{returni18n.Unicode.isRTL(char);}// 判断字符串char是否是表意文字staticisIdeograph(char:string):boolean{returni18n.Unicode.isIdeograph(char);}// 判断是否空白符空格、制表符、全角空格和不间断空格staticisBlankChar(c:number):boolean{returnCharUtil.isWhitespace(c.toString())||CharUtil.isSpaceChar(c.toString())||c0xFEFF||c0x202A||c0x0000;}// 判断字符是否位于ASCII范围内0-31控制字符32-127字母字符staticisAscii(char:string):boolean{if(char.length1){returnchar.charCodeAt(0)128;}else{returnfalse;}}}方法速查表方法说明示例输入返回值isDigit(char)是否为数字0-9含全角数字5trueisLetter(char)是否为字母含中文汉字A、中trueisLowerCase(char)是否为小写字母atrueisUpperCase(char)是否为大写字母AtrueisSpaceChar(char)是否为 Unicode 空格符 全角空格trueisWhitespace(char)是否为空白符含制表符\t\ttrueisRTL(char)是否为 RTL 语言字符阿拉伯语/希伯来语عtrueisIdeograph(char)是否为表意文字汉字/日文/韩文等中trueisBlankChar(code)是否为广义空白符含 BOM 等0x0020trueisAscii(char)是否在 ASCII 范围内 128Atrue三、Demo 演示多字符实时检测下面是案例 DemoCacheCharClickDemoPage.ets中完整的字符检测逻辑3.1 核心检测函数// 对输入字符串中的每个字符逐一检测runCharCheck(){constinputthis.charInput;if(input.length0){this.charResults[];return;}constresults:CharCheckResult[][];for(leti0;iinput.length;i){constchinput.charAt(i);constcodech.charCodeAt(0);constitem:CharCheckResult{char:ch,results:[{method:isDigit,label:数字,result:CharUtil.isDigit(ch)},{method:isLetter,label:字母,result:CharUtil.isLetter(ch)},{method:isLowerCase,label:小写,result:CharUtil.isLowerCase(ch)},{method:isUpperCase,label:大写,result:CharUtil.isUpperCase(ch)},{method:isSpaceChar,label:空格符,result:CharUtil.isSpaceChar(ch)},{method:isWhitespace,label:空白符,result:CharUtil.isWhitespace(ch)},{method:isAscii,label:ASCII,result:CharUtil.isAscii(ch)},{method:isIdeograph,label:表意文字,result:CharUtil.isIdeograph(ch)},{method:isRTL,label:从右到左,result:CharUtil.isRTL(ch)},]};results.push(item);}this.charResultsresults;}3.2 字符综合分类// 根据多个方法综合判断字符类型getCharType(ch:string):string{if(CharUtil.isDigit(ch))return数字;if(CharUtil.isLetter(ch))returnCharUtil.isUpperCase(ch)?大写字母:CharUtil.isLowerCase(ch)?小写字母:字母;if(CharUtil.isWhitespace(ch))return空白;if(CharUtil.isIdeograph(ch))return中文/汉字;if(CharUtil.isAscii(ch))returnASCII;return其他;}这个getCharType函数展示了如何组合多个 CharUtil 方法完成综合判断优先级从高到低数字 字母含大小写判断 空白 表意文字 ASCII 其他。3.3 UI 展示部分// 字符输入框Column(){Text(字符输入支持多字符).fontSize(13).fontColor(#666).fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:6})TextInput({text:this.charInput,placeholder:输入单个或多个字符...}).width(100%).height(44).fontSize(18).backgroundColor(#F5F6FA).borderRadius(8).textAlign(TextAlign.Center).onChange((v:string){this.charInputv;this.runCharCheck();// 输入改变时立即检测})Button(刷新检测).width(100%).height(36).margin({top:8}).backgroundColor(#4080FF).fontColor(#FFF).fontSize(13).onClick((){this.runCharCheck();})}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)// 批量检测结果展示ForEach(this.charResults,(cr:CharCheckResult){Column(){Row(){Text(${cr.char}).fontSize(20).fontWeight(FontWeight.Bold).fontColor(#1a1a1a)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)四、实战校验场景场景 1手机号校验纯数字functionisValidPhone(phone:string):boolean{if(phone.length!11)returnfalse;for(leti0;iphone.length;i){if(!CharUtil.isDigit(phone.charAt(i)))returnfalse;}returntrue;}场景 2密码强度检测interfacePasswordStrength{hasUpper:boolean;// 含大写字母hasLower:boolean;// 含小写字母hasDigit:boolean;// 含数字level:弱|中|强;}functioncheckPasswordStrength(password:string):PasswordStrength{lethasUpperfalse,hasLowerfalse,hasDigitfalse;for(leti0;ipassword.length;i){constchpassword.charAt(i);if(CharUtil.isUpperCase(ch))hasUppertrue;if(CharUtil.isLowerCase(ch))hasLowertrue;if(CharUtil.isDigit(ch))hasDigittrue;}constscore[hasUpper,hasLower,hasDigit].filter(Boolean).length;constlevelscore3?强:score2?中:弱;return{hasUpper,hasLower,hasDigit,level};}场景 3过滤非 ASCII 字符functionfilterNonAscii(text:string):string{letresult;for(leti0;itext.length;i){constchtext.charAt(i);if(CharUtil.isAscii(ch)){resultch;}}returnresult;}// 使用filterNonAscii(Hello世界);// 输出Hello五、isLetter vs isIdeograph 的区别这是一个常见误区isLetter会对汉字返回true因为 i18n 标准中汉字属于字母范畴Letter in Unicode。字符isLetterisIdeographisAsciiA✅❌✅中✅✅❌5❌❌✅!❌❌✅结论如果要判断纯英文字母需要同时满足isLetter isAscii。六、小结CharUtil本质上是对 HarmonyOSi18n.Unicode的友好封装让开发者不需要了解底层 Unicode 规范就能完成字符判断。核心方法记住 6 个就够日常使用数字isDigit字母isLetter含中文、isUpperCase、isLowerCase空白isWhitespace中文isIdeographASCIIisAscii