利用汉字拼音首字母进行快速检索,效率比直接检索汉字高很多。在ASCII编码中,汉字是按拼音首字母的顺序进行编码的,也就是说拼音首字母相同的汉字的编译是连续的、相对集中的。那么就可以通过比较汉字ASCII码的大小来确定其拼音首字母了。例如:如果汉字的ASCII码 n 满足 n >= 0xB0A1 && n <= 0xB0C4,说明该汉字的拼音首字母是A。

  • 首先,写一个判断数值范围的辅助函数。
// 判断var的值是否处于两者之间
bool    Between(int var, int lower, int upper)
{assert(upper >= lower);return (var >= lower) && var <= upper;
}
  • 然后是获得一个汉字拼音首字母的函数。
ASCII用两个char来表示一个汉字,分别作为汉字ASCII值的高低位,因些将两个字符组合成一个ASCII值,就可以与拼音首字母的临界值比较了。
char GetPinyinHead(const char * pszText)
{assert(strlen(pszText) == 2);unsigned char hi    = static_cast<unsigned char>(pszText[0]);unsigned char low   = static_cast<unsigned char>(pszText[1]);int val= unsigned short(hi << 8) +low;if (Between(val, 0xB0A1, 0xB0C4)) return 'A';if (Between(val, 0XB0C5, 0XB2C0)) return 'B';if (Between(val, 0xB2C1, 0xB4ED)) return 'C';if (Between(val, 0xB4EE, 0xB6E9)) return 'D';if (Between(val, 0xB6EA, 0xB7A1)) return 'E';if (Between(val, 0xB7A2, 0xB8c0)) return 'F';if (Between(val, 0xB8C1, 0xB9FD)) return 'G';if (Between(val, 0xB9FE, 0xBBF6)) return 'H';if (Between(val, 0xBBF7, 0xBFA5)) return 'J';if (Between(val, 0xBFA6, 0xC0AB)) return 'K';if (Between(val, 0xC0AC, 0xC2E7)) return 'L';if (Between(val, 0xC2E8, 0xC4C2)) return 'M';if (Between(val, 0xC4C3, 0xC5B5)) return 'N';if (Between(val, 0xC5B6, 0xC5BD)) return 'O';if (Between(val, 0xC5BE, 0xC6D9)) return 'P';if (Between(val, 0xC6DA, 0xC8BA)) return 'Q';if (Between(val, 0xC8BB, 0xC8F5)) return 'R';if (Between(val, 0xC8F6, 0xCBF0)) return 'S';    if (Between(val, 0xCBFA, 0xCDD9)) return 'T';if (Between(val, 0xCDDA, 0xCEF3)) return 'W';if (Between(val, 0xCEF4, 0xD188)) return 'X';if (Between(val, 0xD1B9, 0xD4D0)) return 'Y';if (Between(val, 0xD4D1, 0xD7F9)) return 'Z';return char(0);
}

  • 最后实现一个取得中文字符串的函数。
字符串中有可能存在非汉字字符,对它们不作任何处理,直接保留。组成汉字ASCII码的两个char值都是小于0的,因此很容易判断字符是不是汉字。
string GetAllPinyinHeads(const char * pszText)
{string rst, temp;string strText = pszText;for (int i = 0; i < strText.length(); i++){if (strText[i] >= 0) // 大于等于0说明非汉字{rst += strText[i];}else{temp += strText[i];if (temp.length() == 2){rst += GetPinyinHead(temp.c_str());temp.clear();}}}return rst;
}

  • 测试一下。
int _tmain(int argc, _TCHAR* argv[])
{string strTxt;while (cin>>strTxt){cout<<GetAllPinyinHeads(strTxt.c_str())<<endl;}return 0;
}

结果不必截图了吧,非常OK!

获取汉字的拼音首字母相关推荐

  1. C# 获取汉字的拼音首字母(转)

    原文:https://blog.csdn.net/younghaiqing/article/details/62417269 一种是把所有中文字符集合起来组成一个对照表:另一种是依照汉字在Unicod ...

  2. C# 获取汉字的拼音首字母和全拼(含源码)

    C# 获取汉字的拼音首字母 一种是把所有中文字符集合起来组成一个对照表:另一种是依照汉字在Unicode编码表中的排序来确定拼音的首字母.碰到多音字时就以常用的为准(第一种方法中可以自行更改,方法为手 ...

  3. (转)C# 获取汉字的拼音首字母和全拼(含源码)[A]

    https://blog.csdn.net/younghaiqing/article/details/62417269 C# 获取汉字的拼音首字母 一种是把所有中文字符集合起来组成一个对照表:另一种是 ...

  4. java汉字转换拼音,获取汉字串拼音首字母

    首先要下载  pinyin4j  的jar包 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

  5. java汉字的拼音首字母_Java 获取汉字的拼音首字母

    Java 获取汉字的拼音首字母: pom.xml 引用 pinyin4j 包: com.belerweb pinyin4j 2.5.0 PinyinUtil 类: package com.xxx.co ...

  6. delphi读音_delphi中获取汉字的拼音首字母

    这段代码处理范围比较广,对于双单字,较偏的字也都能处理,是目前比较流行且全面的在delphi中获取汉字的拼音首字母的代码. 1.以下代码段直接复制在代码里即可. {$R *.dfm} py: arra ...

  7. java获取汉字的拼音首字母_java获取汉字的拼音首字母

    import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Title: ChineseCharToEn * @dat ...

  8. js获取汉字的拼音首字母

    前言 参考<JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容> 自己写的在线示例

  9. vb.net获取汉字串拼音首字母

    代码: Public Shared Function FirstSpell(strText As String) As StringDim py1 = Function(cnChar As Strin ...

最新文章

  1. OpenCV 2.4.9-2.4.13各个版本附加依赖项Lib文件汇总
  2. Eclipse编辑jsp、js文件时,经常出现卡死现象解决汇总
  3. 云原生应用 Kubernetes 监控与弹性实践
  4. 轨迹规划实现 tfaar_example2.7
  5. iview兼容ie8_如何解决iview在安卓4.4.4的webview中的兼容性
  6. 将centos字符编码换成utf-8
  7. maven设置从本地读_如何在Eclipse中更改Maven本地存储库
  8. 【蓝桥杯】题目 1117: K-进制数
  9. 作为一个程序员需要学多少技能?
  10. JAVA设计模式之3-抽象工厂模式
  11. 百度,google等搜索引擎的网络蜘蛛基本原理
  12. Windows下XMake编译imgui成功之DX11
  13. 三代测序组装软件-----La Jolla Assembler软件运行
  14. 滴滴2018秋招编程题
  15. 详解 ARM PMU (Performance Monitoring Unit)
  16. Django項目部署到Ubuntu服務器
  17. 【Mathematica】 最小二乘法
  18. 学习如逆水行舟,不进则退
  19. Huffman编码、Shannon编码、Fano编码——《小王子》文本压缩与解压
  20. android 全局缓存,【Android进阶】RecyclerView之缓存(二)

热门文章

  1. 平板触控笔有哪些用途?超高性价比的触控笔推荐
  2. 2011年恒生电子校园招聘笔试题目
  3. sql中的date的使用
  4. ImGui实现Button高亮
  5. python安装包报错解决方案
  6. 人工蜂群算法(ABC算法)
  7. 用什么软件压缩视频最好?最好的视频压缩软件?
  8. 壹账通否认财务造假,此前市值已蒸发近8成
  9. 快手+中科大 | 全曝光推荐数据集KuaiRec 2.0版本
  10. 吴军《数学之美》第二版阅读整理