Author: 水如烟

暂歇一下写那个区划方案。

平常中,经常用到汉字转拼音,比如批量生成姓名->拼音作为登录帐号。

这个方法只是简单的利用汉字拼音库。至于怎么找这个库,网上多有介绍。在最后提供下载的方案中也提供了这个库文本文件。

主要代码如下:

Imports  System.IO
Imports  System.Text.RegularExpressions

Namespace  Businness.PinYin
     Public   Class  PYService
         Private  gDataSet  As   New  dsPinYin

' '' <summary>
         ' '' 汉字表
         ' '' </summary>
         Public   ReadOnly   Property  PinYinTable()  As  dsPinYin.PinYinDataTable
             Get
                 Return  gDataSet.PinYin
             End   Get
         End Property

Private  gTxtFile  As   String   =  AppDomain.CurrentDomain.SetupInformation.ApplicationBase  &   " pinyin.txt "
         Private  gxmlFile  As   String   =  AppDomain.CurrentDomain.SetupInformation.ApplicationBase  &   " pinyin.xml "

Private  gRegex  As   New  Regex("(?<Word>^[/u4e00-/u9fa5]+)(?<PingYin>.*)")

' '' <summary>
         ' '' 加载汉字库,文件名为pinyin.xml,在程序当前目录下
         ' '' </summary>
         Public   Sub  Load()
             If   Not  IO.File.Exists(gxmlFile)  Then
                 Throw   New  Exception( String .Format( " 文件{0}不存在 " , gxmlFile))
             End   If

DataSetInitialize()
            gDataSet.ReadXml(gxmlFile)
         End Sub

' '' <summary>
         ' '' 从汉字文件中更新,文件名为pinyin.txt,在程序当前目录下
         ' '' </summary>
         ' '' <remarks></remarks>
         Public   Sub  Update()
             If   Not  IO.File.Exists(gTxtFile)  Then
                 Throw   New  Exception( String .Format( " 文件{0}不存在 " , gTxtFile))
             End   If

UpdateFromTxt(gTxtFile)
         End Sub

' '' <summary>
         ' '' 保存汉字库,文件为pingyin.xml,在程序当前目录下
         ' '' </summary>
         ' '' <remarks></remarks>
         Public   Sub  Save()
            gDataSet.WriteXml(gxmlFile)
         End Sub

Private   Sub  DataSetInitialize()
             ' 在更新或读入时,清除
             Me .gDataSet.Clear()
             Me .gDataSet.AcceptChanges()
         End Sub

Private   Sub  UpdateFromTxt( ByVal  file  As   String )
            DataSetInitialize()

Dim  mLine  As   String
             Dim  mBuilder  As   New  System.Text.StringBuilder
             Dim  mReader  As   New  IO.StreamReader(file, System.Text.Encoding.Default)
             Do
                mLine  =  mReader.ReadLine
                Add(mLine)
             Loop   Until   String .IsNullOrEmpty(mLine)

mReader.Close()
            mReader.Dispose()

Me .gDataSet.PinYin.AcceptChanges()
         End Sub

Private   Sub  Add( ByVal  line  As   String )
             If  line  Is   Nothing   Then   Exit Sub

With  gRegex.Match(line)

If  .Success  Then

' 只取单字,不取词组
                     If  .Groups( " Word " ).Value.Length  =   1   Then
                        Add(.Groups( " Word " ).Value, .Groups( " PingYin " ).Value)
                     End   If

End   If
             End   With
         End Sub

Private   Sub  Add( ByVal  word  As   String ,  ByVal  py  As   String )
             ' 多音的,拼音间用单个空枨符隔开

py  =  py.Trim.Replace( "    " ,  "   " )

Dim  mCode  As   String   =  ChineseCode(word)
             Dim  mRow  As  dsPinYin.PinYinRow  =   Me .gDataSet.PinYin.FindBy代码(mCode)
             If  mRow  Is   Nothing   Then
                 Me .gDataSet.PinYin.AddPinYinRow(word, mCode, py)
             Else
                 Dim  pyArray()  As   String   =  py.Split( "   " c)
                 For   Each  s  As   String   In  pyArray
                     If   Not  mRow.拼音.Contains(s)  Then
                        mRow.拼音  =   String .Concat(mRow.拼音,  "   "   &  s)
                     End   If
                 Next
             End   If

End Sub

' '' <summary>
         ' '' 将字符串转为拼音
         ' '' </summary>
         ' '' <param name="line">字符串</param>
         ' '' <param name="isgetfirst">如是多音字,取第一个拼音</param>
         Public   Function  ToPinyin( ByVal  line  As   String ,  ByVal  isgetfirst  As   Boolean )  As   String
             Dim  mBuilder  As   New  Text.StringBuilder

For   Each  s  As   Char   In  line.ToCharArray
                 If  IsTrue(s)  Then
                    mBuilder.Append(GetPinyin(s, isgetfirst))
                 Else
                    mBuilder.Append(s)
                 End   If
             Next

Return  mBuilder.ToString
         End Function

Private   Function  GetPinyin( ByVal  word  As   String ,  ByVal  isgetfirst  As   Boolean )  As   String
             Dim  mResult  As   String   =  word

Dim  mArray  As   String ()  =  PinYinArray(ChineseCode(word))  ' 取拼音组
             If   Not  mArray  Is   Nothing   Then
                 If  mArray.Length  =   1   Or  isgetfirst  Then
                    mResult  =  mArray( 0 )  ' 单音的
                 Else

mResult  =   String .Format( " ({0}) " ,  String .Join( " , " , mArray))  ' 多音的用括号括住,拼音间用逗号隔开
                 End   If
             End   If

Return  mResult
         End Function

' 取拼音组
         Private   Function  PinYinArray( ByVal  code  As   String )  As   String ()
             Dim  mRow  As  dsPinYin.PinYinRow  =   Me .gDataSet.PinYin.FindBy代码(code)
             If  mRow  Is   Nothing   Then   Return   Nothing

Return  mRow.拼音.Split( "   " c)
         End Function

' '' <summary>
         ' '' 按拼音查字
         ' '' </summary>
         ' '' <param name="pinyin">拼音</param>
         Public   Function  WordArray( ByVal  pinyin  As   String )  As   String ()
             Dim  mRows  As  dsPinYin.PinYinRow()  =   CType ( Me .gDataSet.PinYin.Select( String .Format( " 拼音 LIKE '%{0}%' " , pinyin)), dsPinYin.PinYinRow())
             Dim  mResult( - 1 )  As   String
             For  i  As   Integer   =   0   To  mRows.Length  -   1
                 If  Array.IndexOf(mRows(i).拼音.Split( "   " c), pinyin)  <>   - 1   Then
                     Me .Append(mResult, mRows(i).汉字)
                 End   If
             Next
             Return  mResult
         End Function

' '' <summary>
         ' '' 按拼音查字
         ' '' </summary>
         ' '' <param name="pinyin">拼音</param>
         Public   Function  Words( ByVal  pinyin  As   String )  As   String
             Return   String .Concat(WordArray(pinyin))
         End Function

' '' <summary>
         ' '' 汉字代码
         ' '' </summary>
         ' '' <param name="word">单个汉字</param>
         Public   Shared   Function  ChineseCode( ByVal  word  As   String )  As   String
             If   Not  IsTrue(word)  Then   Return   Nothing

Dim  bytes()  As   Byte   =  System.Text.Encoding.Default.GetBytes(word)

Return   String .Concat( Hex (bytes( 0 )),  Hex (bytes( 1 )))
         End Function

' '' <summary>
         ' '' 是否是单个汉字
         ' '' </summary>
         ' '' <param name="word">字符</param>
         Public   Shared   Function  IsTrue( ByVal  word  As   String )  As   Boolean
             If  word  Is   Nothing   Then   Return   False

Return  System.Text.RegularExpressions.Regex.IsMatch(word,  "^[/u4e00-/u9fa5]$" )
         End Function

Private   Sub  Append( ByRef  collection  As   String (),  ByVal  value  As   String )
             ReDim   Preserve  collection(collection.Length)
            collection(collection.Length  -   1 )  =  value
         End Sub
     End Class
End Namespace

效果图:

下载方案:代码  版本二

汉字拼音的一个解决方法相关推荐

  1. 汉字拼音的一个解决方法(初具使用价值)

    Author: 水如烟 这个版本已有使用价值.如果要求不高,基本满足需要.一并贴出来,也对比一下. 这个版本的汉字库已纳入程序资源里头,大小为324K. 主要代码如下: Namespace  Busi ...

  2. mysql数据库sql汉字数字排序_MYSQL数据库UTF8编码使用汉字拼音第一个字母排序的方法...

    MYSQL数据库UTF8编码使用汉字拼音第一个字母排序的方法 今天做网站时遇到了这样一个问题,有一个标签数据库,在管理标签时想按标签列的汉字拼音的第一个字母排序,这样人工查找的时候就很快可以看到: 于 ...

  3. iOS获取汉字拼音首字母的方法

    iOS获取汉字拼音首字母的方法 之前在项目中需要根据昵称的首字母进行排序,蹚了几个坑,今天记录一下.其实iOS系统封装的就有获取汉字首字母的方法,但不推荐,想看最优解的同学直接略过: var name ...

  4. Requirejs加载超时问题的一个解决方法:设置waitSeconds=0

    Requirejs加载超时问题的一个解决方法:设置waitSeconds=0 参考文章: (1)Requirejs加载超时问题的一个解决方法:设置waitSeconds=0 (2)https://ww ...

  5. mysql启动失败的一个解决方法

    mysql启动失败的一个解决方法 参考文章: (1)mysql启动失败的一个解决方法 (2)https://www.cnblogs.com/notfresh/p/mysqlStartError.htm ...

  6. python怎么识别拼音-python获取一组汉字拼音首字母的方法

    本文实例讲述了python获取一组汉字拼音首字母的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python # -*- coding: utf-8 -*- def m ...

  7. python汉字拼音查询_python获取一组汉字拼音首字母的方法

    本文实例讲述了python获取一组汉字拼音首字母的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python # -*- coding: utf-8 -*- def m ...

  8. mysql查询汉字拼音首字母的方法_MySQL查询汉字拼音首字母的方法

    下面为您介绍了MySQL查询汉字拼音首字母的方法,该方法极具实用价值,如果您之前遇到过类似方面的问题,不妨一看. MySQL查询汉字拼音首字母方法如下: 1.建立拼音首字母资料表 Sql代码: DRO ...

  9. python汉字转拼音首字母_python获取一组汉字拼音首字母的方法

    作者:不吃皮蛋 字体: 类型:转载 这篇文章主要介绍了python获取一组汉字拼音首字母的方法,涉及Python针对汉字操作的相关技巧,需要的朋友可以参考下 本文实例讲述了python获取一组汉字拼音 ...

最新文章

  1. 华为、百度、小米踏上造车新征程,软件如何吞噬汽车?
  2. 蓝桥杯最短路(java过)spfa单源最短路算法
  3. OpenKruise:解放 DaemonSet 运维之路
  4. Microsoft宣布为Power BI提供AI模型构建器,关键驱动程序分析和Azure机器学习集成...
  5. 【转】Ubuntu下使用sysv-rc-conf管理服务
  6. 如何快速下载CentOS7镜像
  7. mysql锁与程序锁_sql 锁类型与锁机制
  8. 5g pdu session_设备 | NEC被选为NTT DOCOMO独立5G移动核心的供应商
  9. php ajax怎么拿id,php ajax无刷新分页,支持id定位
  10. IOS AVPlayer视频播放器 AVPlayerViewController视频播放控制器
  11. 这些CAD制图初学入门问题你遇到过吗?CAD制图初学入门全攻略!
  12. 机器学习(课堂笔记)Day01:机器学习相关概念简介
  13. 紫罗兰永恒花园女性CG模型作品
  14. 我写代码的这十年——致逝去的青春
  15. 本周运气大爆发~希望不会把自己的好运都用光了……
  16. Python实现输出电话号码对应的字母组合
  17. 互联网公司招聘--奇虎360--技术类--2013年笔试题
  18. 《寒蝉鸣泣之时:携带版》游戏截图
  19. CISP管理部分-3、信息安全管理
  20. spaceclaim简单建模

热门文章

  1. js是滚动条滑到固定位置_JavaScript 滚动条定位指定位置
  2. kali linux查询自己的ip,Kali Linux常用服务配置教程获取IP地址
  3. 毫米波雷达的硬件架构与射频前端
  4. java 反射 获取 实例_java通过类反射获取某个类的所有信息--代码实例
  5. MySQL之索引及其背后的数据结构
  6. android 5.1 flash,Flash Player for Android 4.0 and 5.1 以上版本(提供下載)
  7. Eclipse的TPTP使用方法
  8. 金融数据分析与挖掘具体实现方法
  9. Android四大组件Service之AIDL详解
  10. python证书有什么用_用Python在获奖证书写上获奖者的名字