找回密码
 加入
搜索
查看: 6905|回复: 13

如何获取中文字符串的首拼

  [复制链接]
发表于 2009-2-16 16:51:04 | 显示全部楼层 |阅读模式
比如“汉字”那么得到H,只需要字符串第一个中文字符的首拼就可以了。谢谢。。。。。。。

[ 本帖最后由 taishantop 于 2009-2-16 22:40 编辑 ]
发表于 2009-2-16 19:11:13 | 显示全部楼层
这个东西你得有一个数据库。。。。哪里这么简单
发表于 2009-2-16 19:28:03 | 显示全部楼层

获取中文首字母+数字+英文 返回大写英文

Global $AscII[24][2] = [[45217,65],[45253,66],[45761,67],[46318,68],[46826,69],[47010,70],[47297,71],[47614,72],[48119,74],[49062,75],[49324,76],[49896,77],[50371,78],[50614,79],[50622,80],[50906,81],[51387,82],[51446,83],[52218,84],[52698,87],[52980,88],[53689,89],[54481,90],[62290,0]]

Func _StringToLetter($sString)
        Local $sReturn = ''
        Local $sStringLen = StringLen($sString)
        For $sI = 1 To $sStringLen
                $sReturn &= _Letter2Alphabet(StringMid($sString,$sI,1))
        Next
        Return $sReturn
EndFunc

Func _Letter2Alphabet($sLetter)
        If BinaryLen(StringToBinary($sLetter, 4)) = 3 Then $sLetter &= Chr(0)
        Return _Num2Alphabet(Dec(StringTrimLeft(StringToBinary($sLetter),2)))
EndFunc

Func _Num2Alphabet($sDigital)
        For $sI = 0 To 22
                If BitAND($sDigital>=$AscII[$sI][0],$sDigital<$AscII[$sI+1][0]) Or $sDigital=$AscII[$sI][1] Or $sDigital=32+$AscII[$sI][1] Then Return Chr($AscII[$sI][1])
        Next
        For $sI = 48 To 57
                If $sDigital=$sI Then Return Chr($sI)
        Next
        Return ''
EndFunc
发表于 2009-2-16 19:39:55 | 显示全部楼层

这个应该能满足你的要求

返回字符串中第一个汉字的首写字母
Global $AscII[24][2] = [[45217,65],[45253,66],[45761,67],[46318,68],[46826,69],[47010,70],[47297,71],[47614,72],[48119,74],[49062,75],[49324,76],[49896,77],[50371,78],[50614,79],[50622,80],[50906,81],[51387,82],[51446,83],[52218,84],[52698,87],[52980,88],[53689,89],[54481,90],[62290,0]]

Func _String2Alphabet($sString)
        Local $sLetter
        $sStringLen = StringLen($sString)
        For $sI = 1 To $sStringLen
                $sLetter = StringMid($sString,$sI,1)
                If BinaryLen(StringToBinary($sLetter, 4)) = 3 Then
                        Return _Num2Alphabet(Dec(StringTrimLeft(StringToBinary($sLetter & Chr(0)),2)))
                EndIf
        Next
        Return ''
EndFunc

Func _Num2Alphabet($sDigital)
        For $sI = 0 To 22
                If BitAND($sDigital>=$AscII[$sI][0],$sDigital<$AscII[$sI+1][0]) Then Return Chr($AscII[$sI][1])
        Next
        Return ''
EndFunc

评分

参与人数 1金钱 +5 收起 理由
35888894 + 5 精品文章

查看全部评分

发表于 2009-2-16 20:55:51 | 显示全部楼层
我靠 受教了!!!
 楼主| 发表于 2009-2-16 22:28:07 | 显示全部楼层

佩服

确实好用。小弟先谢过了。。。。。。。。。。
发表于 2009-2-17 11:32:29 | 显示全部楼层
对文件编码 汉字编码等 一直很迷茫 囧rz
发表于 2009-2-19 16:34:05 | 显示全部楼层
学习一下。
发表于 2012-12-5 01:02:00 | 显示全部楼层
学习一下。
发表于 2012-12-5 01:28:13 | 显示全部楼层
本帖最后由 netegg 于 2012-12-5 01:53 编辑

/** 获取一个汉字的拼音首字母。
  * GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码
  * 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43
  * 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’
  */
区位码拼音范围百度下,http://wenku.baidu.com/view/343ac319964bcf84b9d57b7d.html
[au3];区位码表
;a:1601~1636
;b:1637~1832
;c:1833~2077
;d:2078~2273
;e:2274~2301
;f:2302~2432
;g:2433~2593
;h:2594~2786
;j:2787~3105
;k:3106~3211
;l:3212~3471
;m:3472~3634
;n:3635~3721
;o:3722~3729
;p:3730~3857
;q:3858~4026
;r:4027~4085
;s:4086~4389
;t:4390~4557
;w:4558~4683
;x:4684~4924
;y:4925~5216
;z:5217~5589[/au3]
发表于 2012-12-5 02:02:44 | 显示全部楼层
/** 获取一个汉字的拼音首字母。
  * GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码
  ...
netegg 发表于 2012-12-5 01:28



    你LS典型的挖坟,顺便把你带进去了……
发表于 2012-12-5 02:16:57 | 显示全部楼层
回复 11# afan
没,编码转换这部分迟早要折腾,和加解密有关系,放着当收藏了
发表于 2015-7-22 10:46:43 | 显示全部楼层
二级汉字不在此范围内,应该如何做?
发表于 2017-8-29 06:54:16 | 显示全部楼层
Global $AscII[24][2] = [[45217,65],[45253,66],[45761,67],[46318,68],[46826,69],[47010,70],[47297,71],[47614,72],[48119,74],[49062,75],[49324,76],[49896,77],[50371,78],[50614,79],[50622,80],[50906,81],[51387,82],[51446,83],[52218,84],[52698,87],[52980,88],[53689,89],[54481,90],[62290,0]]

Func _StringToLetter($sString)
        Local $sReturn = ''
        Local $sStringLen = StringLen($sString)
        For $sI = 1 To $sStringLen
                $sReturn &= _Letter2Alphabet(StringMid($sString,$sI,1))
        Next
        Return $sReturn
EndFunc

Func _Letter2Alphabet($sLetter)
        If BinaryLen(StringToBinary($sLetter, 4)) = 3 Then $sLetter &= Chr(0)
        Return _Num2Alphabet(Dec(StringTrimLeft(StringToBinary($sLetter),2)))
EndFunc

Func _Num2Alphabet($sDigital)
        For $sI = 0 To 22
                If BitAND($sDigital>=$AscII[$sI][0],$sDigital<$AscII[$sI+1][0]) Or $sDigital=$AscII[$sI][1] Or $sDigital=32+$AscII[$sI][1] Then Return Chr($AscII[$sI][1])
        Next
        For $sI = 48 To 57
                If $sDigital=$sI Then Return Chr($sI)
        Next
        Return ''
EndFunc

MsgBox(4096,'te',_StringToLetter("中国人"))

为什么是空白啊?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 22:49 , Processed in 0.259817 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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