汉字转拼音的c++实现

目的

在一个项目里,需要根据输入的一组汉字来自动生成这组汉字的拼音首字母字符串,搜了一下,很多实现方案,记录下。

平台

Win10 64bit + VS15

代码


void GetFirstLetter(CString sName, CString& sFirstLetter)
{
    //高低字节
    TCHAR cHigh = 0, cLow = 0;
    //内码
    int  nCode = 0;
    //每个字的拼音首字母
    CString sLetter;

    sFirstLetter.Empty();
    int nLen = sName.GetLength();

    char* buffer  = new char[nLen * sizeof(TCHAR) + 1];
    ZeroMemory(buffer, nLen * sizeof(TCHAR) + 1);
    WideCharToMultiByte(CP_ACP, NULL, sName, nLen, buffer, nLen * sizeof(TCHAR) + 1, NULL, NULL);

    for (UINT i = 0; i<nLen * sizeof(TCHAR); i++)
    {
        if ((UCHAR)buffer[i] < 0x80)
            continue;
        cHigh = (UCHAR)buffer[i];
        cLow = (UCHAR)buffer[i + 1];
        if (cHigh < 0xa1 || cLow < 0xa1)
            continue;
        else
            nCode = (cHigh - 0xa0) * 100 + cLow - 0xa0;

        FirstLetter(nCode, sLetter);
        sFirstLetter += sLetter;
        i++;
    }

    delete []buffer;
}

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

使用

使用的时候只有调用GetFirstLetter()函数就可以了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值