如何获取一串汉字的每个汉字的拼音首字母

yanjing_mail 2008-10-13 11:15:48
例如:"好好学习",取首字母后为"hhxx"
...全文
495 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinzhaohui 2008-10-13
  • 打赏
  • 举报
回复
XXXX
}
string strChinese = "计算机";
string result = MakeSpellCode(strChinese,SPELLCODE_FIRSTLETTERONLY|SPELLCODE_ENABLELETTER);
printf("%s\r\n",result.c_str());
yinzhaohui 2008-10-13
  • 打赏
  • 举报
回复
const char _spellMusicCode[][32] =
{
"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao",
"bei", "ben", "beng", "bi", "bian", "biao", "bie", "bin", "bing", "bo",
"bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai",
"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu",
"chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu",
"cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de",
"deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du",
"duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang",
"fei", "fen", "feng", "fu", "fou", "ga", "gai", "gan", "gang", "gao",
"ge", "ji", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan",
"guang", "gui", "gun", "guo", "ha", "hai", "han", "hang", "hao", "he",
"hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang",
"hui", "hun", "huo", "jia", "jian", "jiang", "qiao", "jiao", "jie", "jin",
"jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan",
"kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao",
"le", "lei", "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin",
"ling", "liu", "long", "lou", "lu", "luan", "lue", "lun", "luo", "ma",
"mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian",
"miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai",
"nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang",
"niao", "nie", "nin", "ning", "niu", "nong", "nu", "nuan", "nue", "yao",
"nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen",
"peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu",
"qi", "qia", "qian", "qiang", "qie", "qin", "qing", "qiong", "qiu", "qu",
"quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri",
"rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san",
"sang", "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao",
"she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang",
"shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun",
"suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian",
"tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo",
"wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi",
"xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu",
"xuan", "xue", "xun", "ya", "yan", "yang", "ye", "yi", "yin", "ying",
"yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan",
"zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang",
"zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai",
"zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan",
"zui", "zun", "zuo", "", "ei", "m", "n", "dia", "cen", "nou",
"jv", "qv", "xv", "lv", "nv"
};

//拼音索引表
const int _spellCodeIndex[][192]=
{
{354,279,331,0,190,39,284,67,249,167,353,19,133,92,129,152,31,385,105,131,84,348,348,329,133,0,376,116,283,349,344,87,133,0,0,0,284,202,0,0,0,0,0,0,342,345,0,276,199,243,0,0,52,0,375,102,88,176,170,348,136,180,375,0,354,294,299,94,344,368,344,55,347,333,131,347,353,369,166,74,325,92,0,329,6,19,0,306,0,332,372,114,107,20,33,370,279,258,79,191,243,328,220,83,43,324,62,376,229,354,64,73,329,348,336,92,2,349,232,282,84,305,389,357,134,332,343,336,363,332,217,208,335,340,377,389,13,232,348,294,348,374,107,181,378,21,250,14,371,47,346,369,14,332,250,284,10,121,110,333,91,78,194,19,113,123,102,251,47,337,282,320,106,157,348,101,349,189,340,3,175,77,178,29,37,343,377,263,125,294,56},
yinzhaohui 2008-10-13
  • 打赏
  • 举报
回复
string MakeSpellCode(string &strChinese, DWORD dwSpellCode)
{
string result = "";
unsigned char *p = (unsigned char*)strChinese.c_str();
unsigned char *endPos = p+strChinese.length();
while(p <= endPos)
{
// 是否为GBK 字符
if(*p>=129 && *(p+1)>=64)
{
if(*p == 163)
{// 全角 ASCII
char character = *(p+1)-128;
if(dwSpellCode & SPELLCODE_ENABLELETTER)
{
if((character >= 97 && character <= 122)
|| (character >= 65 && character <= 90)
|| (character >= 48 && character <= 57))
{//非控件字符
result+=::toupper(character);
}
}
p+=2;
}
else if(*p == 162)
{// 罗马数字
if(*(p+1) > 160)
{
result+=_charIndex[*(p+1)-160];
}
else if(dwSpellCode & SPELLCODE_TRANSLATEUNKNOWWORDTOINTERROGATION)
{
// 在罗马数字区, 不能翻译的字符非罗马数字
result+="?";
}
p+=2;
}
else if(*p == 166)
{
if(*(p+1) > 192)
{
result+=_charIndex2[*(p+1)-193];
}
else if(dwSpellCode & SPELLCODE_TRANSLATEUNKNOWWORDTOINTERROGATION)
{
// 在罗马数字区, 不能翻译的字符非罗马数字
result+="?";
}
p+=2;
}
else
{
int index = _spellCodeIndex[*p-129][*(p+1)-64] - 1;
if(index == 0)
{//无此汉字, 不能翻译的字符, GBK 保留
//是否翻译为问号
if(dwSpellCode & SPELLCODE_TRANSLATEUNKNOWWORDTOINTERROGATION)
result += "?";
p+=2;
}
else if(dwSpellCode & SPELLCODE_FIRSTLETTERONLY)
{//是单拼音
result += ::toupper(_spellMusicCode[index][0]);
p+=2;
}
else
{
result += ::CharUpperA((LPSTR)_spellMusicCode[index]);
p+=2;
}
}
}
else
{
if(dwSpellCode & SPELLCODE_ENABLELETTER)
{
if((*p >= 97 && *p <= 122)||(*p >= 65 && *p <= 90)||(*p >= 48 && *p <= 57))
result += ::toupper(*p);
}
p++;
}
}
return result;
}
ok1234567 2008-10-13
  • 打赏
  • 举报
回复
本人使用的一个函数,处理GBK 码,将一串汉字的首字母连成一个缩略串

char * GetFirstLetter(char *psz, char *pszFirstLetter)
{
TBYTE ucHigh, ucLow;
int nCode;
int i;
int len = 0;
for (i=0; i < (int)strlen(psz); i++)
{
if ((TBYTE)psz[i] < 0x80) continue;

ucHigh = (TBYTE)psz[i];
ucLow = (TBYTE)psz[i+1];
if ( ucHigh < 0xa1 || ucLow < 0xa1) continue;
else nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;

if(nCode >= 1601 && nCode < 1637) pszFirstLetter[len] = 'A';
if(nCode >= 1637 && nCode < 1833) pszFirstLetter[len] = 'B';
if(nCode >= 1833 && nCode < 2078) pszFirstLetter[len] = 'C';
if(nCode >= 2078 && nCode < 2274) pszFirstLetter[len] = 'D';
if(nCode >= 2274 && nCode < 2302) pszFirstLetter[len] = 'E';
if(nCode >= 2302 && nCode < 2433) pszFirstLetter[len] = 'F';
if(nCode >= 2433 && nCode < 2594) pszFirstLetter[len] = 'G';
if(nCode >= 2594 && nCode < 2787) pszFirstLetter[len] = 'H';
if(nCode >= 2787 && nCode < 3106) pszFirstLetter[len] = 'J';
if(nCode >= 3106 && nCode < 3212) pszFirstLetter[len] = 'K';
if(nCode >= 3212 && nCode < 3472) pszFirstLetter[len] = 'L';
if(nCode >= 3472 && nCode < 3635) pszFirstLetter[len] = 'M';
if(nCode >= 3635 && nCode < 3722) pszFirstLetter[len] = 'N';
if(nCode >= 3722 && nCode < 3730) pszFirstLetter[len] = 'O';
if(nCode >= 3730 && nCode < 3858) pszFirstLetter[len] = 'P';
if(nCode >= 3858 && nCode < 4027) pszFirstLetter[len] = 'Q';
if(nCode >= 4027 && nCode < 4086) pszFirstLetter[len] = 'R';
if(nCode >= 4086 && nCode < 4390) pszFirstLetter[len] = 'S';
if(nCode >= 4390 && nCode < 4558) pszFirstLetter[len] = 'T';
if(nCode >= 4558 && nCode < 4684) pszFirstLetter[len] = 'W';
if(nCode >= 4684 && nCode < 4925) pszFirstLetter[len] = 'X';
if(nCode >= 4925 && nCode < 5249) pszFirstLetter[len] = 'Y';
if(nCode >= 5249 && nCode < 5590)
{
pszFirstLetter[len] = 'Z';
}
i++;
len++;
}
pszFirstLetter[len] = '\0';

return pszFirstLetter;
}
yanjing_mail 2008-10-13
  • 打赏
  • 举报
回复
1楼的方法只能取一些简单常用的汉字,复杂一点就不行了
m_nNightmire 2008-10-13
  • 打赏
  • 举报
回复
学习~
11000000 2008-10-13
  • 打赏
  • 举报
回复
这个应该很难,没有1楼说的那个简单吧。
rollrock1987 2008-10-13
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
1 楼mutant(异类)回复于 2000-12-15 14:29:00 得分 0

用输入法生成器将区位的码表文件和微软拼音的码表文件转出来
根据区位码找到汉字,根据汉字找到拼音(多音)和声调(微软拼音码表文件中有,1,2,3,4)
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20010818/12/244604.html
Dan_M 2008-10-13
  • 打赏
  • 举报
回复
汉字是按拼音排序的


void CSystemDlg::FirstLetter(int nCode, CString &strLetter)
{

if(nCode >= 1601 && nCode < 1637) strLetter = _T("A");
if(nCode >= 1637 && nCode < 1833) strLetter = _T("B");
if(nCode >= 1833 && nCode < 2078) strLetter = _T("C");
if(nCode >= 2078 && nCode < 2274) strLetter = _T("D");
if(nCode >= 2274 && nCode < 2302) strLetter = _T("E");
if(nCode >= 2302 && nCode < 2433) strLetter = _T("F");
if(nCode >= 2433 && nCode < 2594) strLetter = _T("G");
if(nCode >= 2594 && nCode < 2787) strLetter = _T("H");
if(nCode >= 2787 && nCode < 3106) strLetter = _T("J");
if(nCode >= 3106 && nCode < 3212) strLetter = _T("K");
if(nCode >= 3212 && nCode < 3472) strLetter = _T("L");
if(nCode >= 3472 && nCode < 3635) strLetter = _T("M");
if(nCode >= 3635 && nCode < 3722) strLetter = _T("N");
if(nCode >= 3722 && nCode < 3730) strLetter = _T("O");
if(nCode >= 3730 && nCode < 3858) strLetter = _T("P");
if(nCode >= 3858 && nCode < 4027) strLetter = _T("Q");
if(nCode >= 4027 && nCode < 4086) strLetter = _T("R");
if(nCode >= 4086 && nCode < 4390) strLetter = _T("S");
if(nCode >= 4390 && nCode < 4558) strLetter = _T("T");
if(nCode >= 4558 && nCode < 4684) strLetter = _T("W");
if(nCode >= 4684 && nCode < 4925) strLetter = _T("X");
if(nCode >= 4925 && nCode < 5249) strLetter = _T("Y");
if(nCode >= 5249 && nCode < 5590) strLetter = _T("Z");
}


void CSystemDlg::GetFirstLetter(CString strName, CString &strFirstLetter)
{

TBYTE ucHigh, ucLow;
int nCode;
CString strRet;

strFirstLetter.Empty();

for (int i=0; i<2; i++)
{
ucHigh = (TBYTE)strName[i];
ucLow = (TBYTE)strName[i+1];
if ( ucHigh < 0xa1 || ucLow < 0xa1)
continue;
else
// Treat code by section-position as an int type parameter,
// so make following change to nCode.
nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;

FirstLetter(nCode, strRet);
strFirstLetter += strRet;
i++;
}

}
还没淹死的鱼 2008-10-13
  • 打赏
  • 举报
回复
唯一的解决办法是查表
  • 打赏
  • 举报
回复
多音字:(
blueink_200451 2008-10-13
  • 打赏
  • 举报
回复
来听课的。。
学习中。。

ding.....
yc_8301 2008-10-13
  • 打赏
  • 举报
回复
来听课的。。
学习中。。
Joephia 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 yanjing_mail 的帖子:]
例如:"好好学习",取首字母后为"hhxx"
[/Quote]

好好看看汉字编码,主要是UNICODE,

学习如何把编码按拼音分类,并建立自己的词典

使用时通过查询词典 获得 拼音,再获得声母或者首字节

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧