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

Author: 水如烟

这个版本已有使用价值。如果要求不高,基本满足需要。一并贴出来,也对比一下。

这个版本的汉字库已纳入程序资源里头,大小为324K。

主要代码如下: 

Namespace  Businness.PinYin
    
Public   Class  SpellInformation
        
Private  gTone  As   String
        
Private  gSpellInput  As   String
        
Private  gSpellExpress  As   String

        
' '' <summary>
         ' '' 声调
         ' '' </summary>
         Public   Property  Tone()  As   String
            
Get
                
Return  gTone
            
End   Get
            
Set ( ByVal  value  As   String )
                gTone 
=  value.Trim
            
End   Set
        
End Property

        
' '' <summary>
         ' '' 拼音输入码
         ' '' </summary>
         Public   Property  SpellInput()  As   String
            
Get
                
Return  gSpellInput
            
End   Get
            
Set ( ByVal  value  As   String )
                gSpellInput 
=  value.Trim
            
End   Set
        
End Property

        
' '' <summary>
         ' '' 拼音
         ' '' </summary>
         Public   Property  SpellExpress()  As   String
            
Get
                
Return  gSpellExpress
            
End   Get
            
Set ( ByVal  value  As   String )
                gSpellExpress 
=  value.Trim
            
End   Set
        
End Property

        
Sub   New ()
        
End Sub

        
' '' <param name="tone">声调</param>
         ' '' <param name="spellinput">拼音输入码</param>
         ' '' <param name="spellexpress">拼音</param>
         Sub   New ( ByVal  tone  As   String ByVal  spellinput  As   String ByVal  spellexpress  As   String )
            
Me .Tone  =  tone
            
Me .SpellInput  =  spellinput
            
Me .SpellExpress  =  spellexpress
        
End Sub

        
' '' <param name="spellexpress">拼音</param>
         Public   Overrides   Function  Equals( ByVal  spellexpress  As   Object As   Boolean
            
Return   Me .SpellExpress.Equals(spellexpress)
        
End Function

        
Public   Overrides   Function  ToString()  As   String
            
Return   String .Format( " 拼音码 {0,-6} 声调 {1} 拼音 {2} " Me .SpellInput,  Me .Tone,  Me .SpellExpress)
        
End Function
    
End Class

End Namespace

 

Namespace  Businness.PinYin
    
Public   Class  Word
        
Private  gValue  As   String

        
' '' <param name="word">单个汉字</param>
         Sub   New ( ByVal  word  As   String )
            
Me .gValue  =  word
        
End Sub

        
' '' <summary>
         ' '' 汉字
         ' '' </summary>
         Public   ReadOnly   Property  Value()  As   String
            
Get
                
Return  gValue
            
End   Get
        
End Property

        
Public   ReadOnly   Property  Code()  As   String
            
Get
                
Return  Common.Code(gValue)
            
End   Get
        
End Property

        
Private  gSpellList  As   New  Dictionary( Of   String , SpellInformation)

        
' '' <summary>
         ' '' 拼音集
         ' '' </summary>
         Public   ReadOnly   Property  Spells()  As  SpellInformation()
            
Get
                
Dim  tmp(gSpellList.Count  -   1 As  SpellInformation
                gSpellList.Values.CopyTo(tmp, 
0 )
                
Return  tmp
            
End   Get
        
End Property

        
' '' <summary>
         ' '' 是否多音字
         ' '' </summary>
         Public   ReadOnly   Property  IsMutiSpell()  As   Boolean
            
Get
                
Return  gSpellList.Count  >   1
            
End   Get
        
End Property


        
Public   Sub  AddSpell( ByVal  spell  As  SpellInformation)
            
If   String .IsNullOrEmpty(spell.SpellExpress)  Then   Exit Sub

            
If   Me .gSpellList.ContainsKey(spell.SpellExpress)  Then   Exit Sub

            
Me .gSpellList.Add(spell.SpellExpress, spell)
        
End Sub

        
Public   Sub  AddSpell( ByVal  tone  As   String ByVal  spellinput  As   String ByVal  spellexpress  As   String )
            
Dim  tmp  As   New  SpellInformation(tone, spellinput, spellexpress)

            AddSpell(tmp)
        
End Sub

        
Public   ReadOnly   Property  DefaultSpell()  As  SpellInformation
            
Get
                
If   Me .gSpellList.Count  =   0   Then   Return   Nothing
                
Return   Me .Spells( 0 )
            
End   Get
        
End Property

        
Public   ReadOnly   Property  DefaultSpellExpress()  As   String
            
Get
                
If  DefaultSpell  Is   Nothing   Then   Return   Nothing
                
Return   Me .DefaultSpell.SpellExpress
            
End   Get
        
End Property

        
Public   ReadOnly   Property  DefaultSpellInput()  As   String
            
Get
                
If  DefaultSpell  Is   Nothing   Then   Return   Nothing
                
Return   Me .DefaultSpell.SpellInput
            
End   Get
        
End Property

        
Public   ReadOnly   Property  DefaultTone()  As   String
            
Get
                
If  DefaultSpell  Is   Nothing   Then   Return   Nothing
                
Return   Me .DefaultSpell.Tone
            
End   Get
        
End Property

        
Public   ReadOnly   Property  AllSpellExpress()  As   String
            
Get
                
If   Me .gSpellList.Count  =   0   Then   Return   Nothing

                
If   Not   Me .IsMutiSpell  Then   Return   Me .DefaultSpellExpress

                
Dim  tmp(gSpellList.Count  -   1 As   String
                
For  i  As   Integer   =   0   To  gSpellList.Count  -   1
                    tmp(i) 
=   Me .Spells(i).SpellExpress
                
Next

                
Return   String .Join( "   " , tmp)
            
End   Get
        
End Property

        
Public   ReadOnly   Property  AllSpellInput()  As   String
            
Get
                
If   Me .gSpellList.Count  =   0   Then   Return   Nothing

                
If   Not   Me .IsMutiSpell  Then   Return   Me .DefaultSpellInput

                
Dim  tmp(gSpellList.Count  -   1 As   String
                
For  i  As   Integer   =   0   To  gSpellList.Count  -   1
                    tmp(i) 
=   Me .Spells(i).SpellInput
                
Next

                
Return   String .Join( "   " , tmp)
            
End   Get
        
End Property

        
Public   ReadOnly   Property  AllTone()  As   String
            
Get
                
If   Me .gSpellList.Count  =   0   Then   Return   Nothing

                
If   Not   Me .IsMutiSpell  Then   Return   Me .DefaultTone

                
Dim  tmp(gSpellList.Count  -   1 As   String
                
For  i  As   Integer   =   0   To  gSpellList.Count  -   1
                    tmp(i) 
=   Me .Spells(i).Tone
                
Next

                
Return   String .Join( "   " , tmp)
            
End   Get
        
End Property

        
Public   Overrides   Function  ToString()  As   String
            
Dim  mBuilder  As   New  System.Text.StringBuilder
            
For   Each  spell  As  SpellInformation  In   Me .Spells
                mBuilder.AppendLine(
String .Concat( Me .Value,  "   " , spell.ToString))
            
Next
            
Return  mBuilder.ToString
        
End Function
    
End Class

End Namespace

 

Imports  System.IO
Imports  System.Text.RegularExpressions

Namespace  Businness.PinYin
    
Public   Class  PYService
        
Private  gDataSet  As  dsPinYin

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

        
' '' <summary>
         ' '' 单个汉字信息
         ' '' </summary>
         ' '' <param name="word">单个汉字</param>
         Public   Function  GetWord( ByVal  word  As   String As  Word
            
Dim  mRow  As  dsPinYin.PinYinRow  =   Me .gDataSet.PinYin.FindBy代码(GetCode(word))

            
Return  RowConverter(mRow)
        
End Function

        
Private   Function  RowConverter( ByVal  row  As  dsPinYin.PinYinRow)  As  Word
            
If  row  Is   Nothing   Then   Return   Nothing

            
Dim  mWord  As   New  Word(row.汉字)

            
Dim  mSpellExpressArray()  As   String   =  row.拼音.Split( "   " c)
            
Dim  mToneArray()  As   String   =  row.声调.Split( "   " c)
            
Dim  mSpellInputArray()  As   String   =  row.拼音码.Split( "   " c)

            
For  i  As   Integer   =   0   To  mSpellExpressArray.Length  -   1
                mWord.AddSpell(mToneArray(i), mSpellInputArray(i), mSpellExpressArray(i))
            
Next

            
Return  mWord
        
End Function

        
Private   Sub  RowUpdate( ByVal  word  As  Word)
            
Dim  mWord  As  Word  =  GetWord(word.Value)
            
If  mWord  Is   Nothing   Then
                
Dim  tmpRow  As  dsPinYin.PinYinRow  =   Me .gDataSet.PinYin.AddPinYinRow(word.Value, word.Code,  "" "" "" True )
                mWord 
=  RowConverter(tmpRow)
            
End   If

            
For   Each  spell  As  SpellInformation  In  word.Spells
                mWord.AddSpell(spell)
            
Next

            
Dim  mRow  As  dsPinYin.PinYinRow  =   Me .gDataSet.PinYin.FindBy代码(mWord.Code)
            
With  mRow
                .拼音码 
=  mWord.AllSpellInput
                .拼音 
=  mWord.AllSpellExpress
                .声调 
=  mWord.AllTone
                .单音 
=   Not  mWord.IsMutiSpell
            
End   With

        
End Sub

        
Public   Sub  Load()
            UpdateFromTxt()
        
End Sub

        
' 文件存放的格式是:汉字,拼音,音调,拼音码
         Private   Sub  UpdateFromTxt()
            
Me .gDataSet  =   New  dsPinYin

            LzmTW.uSystem.uCollections.CommonServices.MoveNext(
Of   String )(My.Resources.pinyin.Split( CChar (vbCrLf)),  AddressOf  Action)

            
Me .gDataSet.AcceptChanges()
        
End Sub


        
' 文件存放的格式是:汉字,拼音,音调,拼音码
         Private   Sub  Action( ByVal  line  As   String )

            
Dim  mArray  As   String ()
            mArray 
=  line.Split( " , " c)

            
If  mArray.Length  <>   4   Then   Exit Sub

            
Dim  mWord  As   String   =  mArray( 0 ).Trim
            
Dim  mSpellExpress  As   String   =  mArray( 1 ).Trim
            
Dim  mTone  As   String   =  mArray( 2 ).Trim
            
Dim  mSpellInput  As   String   =  mArray( 3 ).Trim

            
Dim  mWordInformation  As   New  Word(mWord)
            mWordInformation.AddSpell(mTone, mSpellInput, mSpellExpress)

            RowUpdate(mWordInformation)

        
End Sub

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

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

            
Return  mBuilder.ToString
        
End Function

        
Private   Function  GetPinyin( ByVal  word  As   String ByVal  isgetfirst  As   Boolean ByVal  forInput  As   Boolean As   String
            
Dim  mResult  As   String

            
Dim  mWord  As  Word  =  GetWord(word)

            
If  isgetfirst  Or   Not  mWord.IsMutiSpell  Then
                
If  forInput  Then
                    mResult 
=  mWord.DefaultSpellInput
                
Else
                    mResult 
=  mWord.DefaultSpellExpress
                
End   If

            
Else
                
If  forInput  Then

                    
Dim  tmpList( - 1 As   String

                    
For   Each  spell  As  SpellInformation  In  mWord.Spells
                        
If  Array.IndexOf(tmpList, spell.SpellInput)  =   - 1   Then
                            LzmTW.uSystem.uCollections.CommonServices.Append(tmpList, spell.SpellInput)
                        
End   If
                    
Next

                    
If  tmpList.Length  =   1   Then
                        mResult 
=  mWord.DefaultSpellInput
                    
Else
                        mResult 
=   String .Format( " ({0}) " String .Join( "   " , tmpList))
                    
End   If
                
Else
                    mResult 
=   String .Format( " ({0}) " , mWord.AllSpellExpress)
                
End   If

            
End   If

            
Return  mResult
        
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
                    LzmTW.uSystem.uCollections.CommonServices.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


        
Public   Function  GetCode( ByVal  word  As   String As   String
            
Return  Common.Code(word)
        
End Function

    
End Class
End Namespace

调用的代码

Public   Class  Form1
    
Dim  gPinyinService  As   New  LzmTW.Businness.PinYin.PYService

    
Private   Sub  ButtonLoad_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  ButtonLoad.Click
        gPinyinService.Load()
        
Me .DataGridView1.DataSource  =  gPinyinService.PinYinTable
    
End Sub

    
Private   Sub  ButtonTran_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  ButtonTran.Click
        
Me .RichTextBox2.Text  =  gPinyinService.ToPinyin( Me .RichTextBox1.Text,  Me .CheckBox1.Checked,  Me .CheckBox2.Checked)
    
End Sub

    
Private   Sub  ButtonWord_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  ButtonWord.Click
        
Me .RichTextBox3.Text  =  gPinyinService.Words( Me .TextBoxPinyin.Text)
    
End Sub

    
Private   Sub  Button1_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  Button1.Click
        
Me .RichTextBox3.Text  =  gPinyinService.GetWord( Me .TextBox1.Text).ToString
    
End Sub
End Class

效果图:

下载方案:代码

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值