/* 默认的strlen只能统计常规字符串数量,DllCall与StrPut都是,且多数扩展字符占用都大于两个字节。 可以用正则来更精确地统计 功能: 中文转为拼音首字母,非中文保持不变 备注: 在 AutoHotkey Unicode 中运行 */ str:="长度𰻝" ; 2个基本汉字+1个unicode扩展G汉字 len:=GetStrLen(str,obj) ; 返回长度与切割后的数组obj MsgBox % "StrLen:" StrLen(str) "`t`tGetStrLen:" len MsgBox % "如果不包含中文字符直接返回`n拼音首字母:" GetFirstChar("如果不包含中文字符直接返回") GetStrLen(str,ByRef obj:="") { Static Count:=0 str:=RegExReplace(str,"[\s\t\r\n]") obj:=StrSplit(RTrim(RegExReplace(str,"O)(.)","$1☯☯☯",Count),"☯☯☯"),"☯☯☯") Return Count } ; 获取中文字符串拼音首字母 GetFirstChar(String){ static nothing := VarSetCapacity(var, 2) static FirstChar:="" static array := [ [-20319,-20284,"A"], [-20283,-19776,"B"], [-19775,-19219,"C"], [-19218,-18711,"D"] , [-18710,-18527,"E"], [-18526,-18240,"F"], [-18239,-17923,"G"], [-17922,-17418,"H"] , [-17417,-16475,"J"], [-16474,-16213,"K"], [-16212,-15641,"L"], [-15640,-15166,"M"] , [-15165,-14923,"N"], [-14922,-14915,"O"], [-14914,-14631,"P"], [-14630,-14150,"Q"] , [-14149,-14091,"R"], [-14090,-13319,"S"], [-13318,-12839,"T"], [-12838,-12557,"W"] , [-12556,-11848,"X"], [-11847,-11056,"Y"], [-11055,-10247,"Z"] ] if !RegExMatch(String, "[^\x{00}-\x{ff}]") Return String obj:=StrSplit(RTrim(RegExReplace(String,"O)(.)","$1☯☯☯",Count),"☯☯☯"),"☯☯☯") Loop, %Count% if ( Asc(obj[A_Index]) >= 0x2E80 and Asc(obj[A_Index]) <= 0x9FFF ) { StrPut(obj[A_Index], &var, "CP936"),nGBKCode :=(NumGet(var, 0, "UChar") << 8)+NumGet(var, 1, "UChar")-65536 For Section, element in array if nGBKCode between % element.1 and % element.2 { FirstChar .= element.3 Break } } else FirstChar .= obj[A_Index] Return FirstChar }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)