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