漢字のピンインのc++の実現

7511 ワード

目的
一つの項目では、入力した漢字のセットに基づいて、この漢字のピンインの頭文字列を自動的に生成する必要があります.検索してみると、多くの実現案が記録されています.
プラットフォーム
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; iif ((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()関数を呼び出すだけです