知识大全 C#如何快速获取助记码

Posted

篇首语:黄沙百战穿金甲,不破楼兰终不还。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#如何快速获取助记码相关的知识,希望对你有一定的参考价值。

C#如何快速获取助记码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  希望通过本文能让大家对C#如何快速获取助记码有更深刻的了解 CTO也向您推荐《C#实用基础教程》

  本文实现

   以牺牲空间为代价 方便快速地实现汉字的助记码获取

   针对拼音特性 实现多音字并提供显式地姓氏调用方法

  网上关于使用C#取助记码的方法很多 不过一般都是采用将每一个码有哪些汉字的方法来实现助记码的转换 它的缺点是显而易见的

   相当于本来应该存放在数据库或者是外部的数据存放到程序中

   利用字符串的定位功能 性能上也不一定好

  在线性表中我们查找指定位置结点的数据是最快的 比如一个包含 个元素的线性表中 无论直接访问哪一个位置的数据值 只要根据表的第一个位置就可以直接定位到第 个元素的位置 数组也是一种简单有效的线性表 需要某个项目 只要通过编移量即可搞定

  在不使用数据库 直接使用文件做资源 方便配置 完成中文到助记码的的转换 同时针对拼音助记码 还要实现 多音字词组匹配 姓氏专用方法

  同时五笔码 四角码等多种类别也易如反掌 虽然在以牺牲空间为代价 但用空间换得时间的性能提高 还是非常值得的

  数据存放使用数组

  数组就是一种线性表 我们的解决思路是

   每一个项目对应一个结构 它包括汉字 拼音码 是否多音字 五笔码(或其它更多编码)

   每一个汉字直接转换成一个数字编码(ASCII或者是UNICODE) 数字就是数组下标

   读取文字串 根据每一个汉字取得数字 直接定位数组中的位置 取得编码

  因此我们定义用于存放汉字的助记简码的结构(有更多编码 只要在结构上扩充即可)

  private struct ItemWord

  

  public int numFlag;

  //是否多音字  public char strWord;

  //当前单词  public string strSpell ;

  //输入码  public string strSpell ;

  //输入码  public string strExt;

  //多音字保留串  public string strName;

  //用于定义姓氏码

  加载助记码字典

  由于要支持拼音及多音字 也支持五笔的助记码 为了例子方便 编码表都暂时存放在d:\\myword下 下面以拼音码的加载为例 首先初始化Itemword中的每一个项目 通常情况下GBK的实际汉字数应该在 字左右 从双字节的角度来看 最多也就只有 K 因此把我们的数组定义为 K 即

  private static readonly int INTMAX = ;  private ItemWord[] stWord = new ItemWord[INTMAX];

  在函数fun_LoadWord中拼音码hzpy txt的加载方法

  while ((strInput = srFile ReadLine()) != null)

  

  chrWord = strInput ToCharArray();

  numIndex = (int)chrWord[ ];

  stWord[numIndex] strWord = chrWord[ ];

  stWord[numIndex] strSpell = chrWord[ ] ToString();

  注意 其中最最关键是把读取的内容转成char的数组 再通过(int)chrWord[ ]把它转换为一个数组的下标值(这个相对来说C就简单许多) 再把相应内容填到数组中此下标项目 对于五笔码的读取方法也一致 非常简单(更多的其它编码也不在话下) 不过 拼音码的多音存储 需要介绍一下 实际上对于汉字来说 单音是大多数 只有少部分才是多音字 为了结构更简单 把多音字是存放在相应的汉字结构中 即

  numIndex = (int)chrWord[ ];

  strInput = strInput Substring( );

  strInput = strInput Replace( \\t );

  strInput = strInput Replace( / );

  stWord[numIndex] strExt = stWord[numIndex] strExt + strInput + | ;

  最终strExt中的结构内容是 |曾哥/Z| 的格式 它的好处会在多音码的展现时进行说明

  从汉字到简码

  我们先举例五笔的助记码实现 对传入的汉字串来说 只要提取每一个汉字 得到对应的字符编码 再直接提取其对应编码 由于直接采用下标取得编码 而数据又加载在内存数组中 可以用飞速来描述它

  chrWord = strChinese ToCharArray();

  numCount = strChinese Length;

  for (i = ; i < numCount; i++)

  

  numIndex = (int)chrWord[i];

  strSpell = strSpell + stWord[numIndex] strSpell ToString();

  拼音码 则存在着几个主要问题 一个是姓氏 还有一个是多音字 多音字的实现 通过词组模式来处理 即首先它是一个多音字 即结构中的numFlag标志 同时根据汉字串往前往后追踪一个形成词组 例如 曾哥 它虽然来源於姓氏 但是本身已经形成一个受众很广的词 在hzpy txt中定义 曾 曾哥 Z 这样一行内容 在多音字时 我们用函数funFindMulti来定位多音字的编码

  strWord = | + ch + ch + / ;  numPos = stWord[numIndex] strExt IndexOf(strWord);

  if (numPos >= ) return stWord[numIndex] strExt Substring(numPos + strWord Length );

  也就是说 但我们定位汉字 曾 时 首先它是一个多音字 再根据词组 曾哥 对应的编码

  我们把用于定位的词组形成前缀 |词组/ 的格式 假定有多个多音时 可以通过唯一位置定位后 再取得此串后面的字符 即 Z 所以当我们输入 信曾哥得自信 时 得到拼音助记码自然就是 XZGDZX 了 因为姓氏的特殊性 并且实际业务中 比较明确地知道 当前的内容是否是姓名 即我们显式调用 而姓名中 也只有在首字时才发生按姓的读音 只要调用参数提供是否姓名的开关(下面的变量IsName 为了文章方便 紧凑格式了)即可

  if (stWord[numIndex] numFlag > && !IsName)if (i > )

  strThis = funFindMulti(numIndex chrWord[i ] chrWord[i]);

  if (strThis Length == && i < numCount )

  strThis = funFindMulti(numIndex chrWord[i] chrWord[i + ]);

  

  if (IsName && i == && stWord[numIndex] strName Length > )strThis = stWord[numIndex] strName;

  if (strThis Length == )strThis = stWord[numIndex] strSpell ToString();

  strSpell = strSpell + strThis;

  当所输入的是单个的姓名时 我们只处理首汉字 比如 金庸 的原名

  对於姓名之后是否按词组处理 比如张长春这样的人 如果指定为姓名 可能叫 ZZC 也可能叫 ZCC 这个很难说 所以在某种程度上 我们解决多音字 只能说是处理 多音字 中的 %问题 还是可以接受的 而且在实际业务中 像 我们这些人参他一本 这样的字串是不会在数据字典中出现的 最后看看多单字中有典型意义的 单 字在三种模式下的效果吧

cha138/Article/program/net/201311/11796

相关参考

知识大全 C#获取机器码

C#获取机器码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<summary>

知识大全 C#获取屏幕分辨率

C#获取屏幕分辨率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystemWind

知识大全 C#获取应用程序所在路径

C#获取应用程序所在路径  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ApplicationS

知识大全 C#获取USB事件API

C#获取USB事件API  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Ar

知识大全 C#获取WAVE文件文件头信息

C#获取WAVE文件文件头信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!usingSystem

知识大全 C# 获取网页html源文件

C#获取网页html源文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<summ

知识大全 用C#获取计算机磁盘空间

用C#获取计算机磁盘空间  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在SystemIO命名空

知识大全 用C#语言获取CPU利用率

用C#语言获取CPU利用率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem

知识大全 C# 如何获取指定目录包含的文件和子目录

C#如何获取指定目录包含的文件和子目录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何获取指

知识大全 JavaScript获取后台C#变量以及调用后台方法

JavaScript获取后台C#变量以及调用后台方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!