获取汉字的拼音首字母

来源:互联网 发布:杭州淘宝美工速成班 编辑:程序博客网 时间:2024/05/16 18:42

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

  • 首先,写一个判断数值范围的辅助函数。
// 判断var的值是否处于两者之间boolBetween(int var, int lower, int upper){assert(upper >= lower);return (var >= lower) && var <= upper;}
  • 然后是获得一个汉字拼音首字母的函数。
     ASCII用两个char来表示一个汉字,分别作为汉字ASCII值的高低位,因些将两个字符组合成一个ASCII值,就可以与拼音首字母的临界值比较了。

charGetPinyinHead(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!
  

原创粉丝点击