找回密码
 加入
搜索
查看: 9313|回复: 17

[AU3基础] 如何用AU3实现识别中文的首字母[已解决]

 火.. [复制链接]
发表于 2012-4-2 18:16:45 | 显示全部楼层 |阅读模式
本帖最后由 xwt620 于 2012-4-13 23:20 编辑

比如将
我们
你们
他们
程序处理后结果为
wm
nm
tm

评分

参与人数 1金钱 +15 收起 理由
afan + 15 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2012-4-2 18:24:20 | 显示全部楼层
回复 1# xwt620


    你需要有汉字拼音对应表。
用au3查这个表就可以了
发表于 2012-4-2 20:44:14 | 显示全部楼层
本帖最后由 user3000 于 2012-4-3 00:50 编辑

论坛中有相关UDF的帖子, 想不起帖子的名字了. 可以自己慢慢找UDF区的相关帖子.
这里上传它的 UDF 文件给你. (汗, 有错别字, 已编辑并更正)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-4-2 20:50:59 | 显示全部楼层
谢谢,做个记号
发表于 2012-4-3 09:45:09 | 显示全部楼层
Global Const $key[27]=['吖','八','擦','耷','俄','发','噶','哈','丌','丌','卡','拉','马','拿','哦','趴','七','然','撒','他','挖','挖','挖','西','丫','匝','匝']
Global $str='测试中文拼音首字母',$L
For $i = 1 To StringLen($str)
        Switch Dec(StringTrimLeft(StringToBinary(StringMid($str,$i,1)),2))
                Case 32 To 127
                        $L&=StringMid($str,$i,1)
                Case 33095 To 62289
                        $L&=Chr(97+_C(StringMid($str,$i,1),0,26))
        EndSwitch
Next
MsgBox(0,'',$L)
Func _C($s,$f,$e)                                ;改进的中值法
                Local $mid=Int(($e-$f)/2)+$f
                If $mid=$f Then Return $f
            If StringCompare($s,$key[$mid])=0 Then
                    Return $mid
            ElseIf StringCompare($s,$key[$mid])>0 Then
                Return _C($s,$mid,$e)
            ElseIf StringCompare($s,$key[$mid])<0 Then
                Return _C($s,$f,$mid)
                EndIf
EndFunc

评分

参与人数 8威望 +2 金钱 +140 贡献 +42 收起 理由
nmgwddj + 10 真牛B,佩服
user3000 + 20 + 3
lixiaolong + 30 + 8 看不懂什么原理...
zch11230 + 10 混个脸熟
happytc + 20

查看全部评分

发表于 2012-4-3 11:09:44 | 显示全部楼层
3mile 发表于 2012-4-3 09:45


测试成功,谢谢
发表于 2012-4-3 11:23:30 | 显示全部楼层
5楼的源码够得我消化了 现在上班 没有办法测试,晚上回去慢慢看。。
发表于 2012-4-3 11:50:13 | 显示全部楼层
回复 5# 3mile


    可以用来做首字母查询
发表于 2012-4-3 13:41:30 | 显示全部楼层
回复 8# zldfsz
读音排序更合适
发表于 2012-4-3 23:46:05 | 显示全部楼层
本帖最后由 298311657 于 2012-4-4 01:05 编辑

根据GB编码写的一个函数,只能识别3755 个常用汉字,所以测试字符串的槑囧两个字取不到首拼字母
比起5L 3mile大侠的函数弱了很多,不过因为没有使用递归,所以效率也好很多。如果只处理常用汉字,可以选择这个,如果要处理所有汉字(常用+生僻+繁简),就使用3mile大侠的函数吧
Global Const $secPosValueList[24] = [ 1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249, 5600 ]
Global Const $firstLetter[23] = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'w', 'x', 'y', 'z' ]
MsgBox(0,'',GetPy('32爱好2(是钱4”:槑囧'))

Func GetPy($mystr)
        Local $py, $tmp, $byte, $secPosValue
        For $j = 1 To StringLen($mystr)
                $tmp = ""
                $byte = StringToBinary(StringMid($mystr,$j,1))
                $secPosValue = (Dec(Hex(BinaryMid($byte,1,1)))-160)*100 + (Dec(Hex(BinaryMid($byte,2,1)))-160)
                For $i = 0 To 22
                        If ($secPosValue >= $secPosValueList[$i] And $secPosValue < $secPosValueList[$i + 1]) Then
                                $tmp = $firstLetter[$i]
                                ExitLoop
                        EndIf
                Next
                If $tmp = "" Then
                        $py &= StringMid($mystr,$j,1)
                Else
                        $py &= $tmp
                EndIf
        Next
        If StringLen($py) Then Return $py
        Return $mystr
EndFunc

评分

参与人数 2金钱 +40 贡献 +2 收起 理由
afan + 30 + 2
zch11230 + 10 这个更好理解一点

查看全部评分

发表于 2012-4-7 22:44:24 | 显示全部楼层
回复 5# 3mile
用10楼的文字’32爱好2(是钱4”:槑囧‘测试才发现标点符号也被转了
发表于 2012-4-8 09:35:28 | 显示全部楼层
回复 3# user3000


    谢谢分享!
 楼主| 发表于 2012-4-13 23:20:07 | 显示全部楼层
回复 5# 3mile


    谢谢~就是要这个功能~
发表于 2012-5-1 01:09:40 | 显示全部楼层
一个比一个强,学习了.
发表于 2012-9-29 21:14:05 | 显示全部楼层
本帖最后由 YGYL 于 2012-9-29 21:15 编辑

UDF_AscII2Alpha_SnT_Exchange.au3 像转 没有正确返回多音
298311657 的某些情况下 中文转换会遗漏
3mile  实测 速度最快(含英文的情况)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 04:49 , Processed in 0.103944 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表