VC++ & Unicode 上での全角/半角の文字判定
正直、VC++ で文字列を扱うこと自体、嫌な思い出ばかりで嫌い・・・
でも EditBox の入力チェックとか、制限とか、かなり文字とは縁があるので避けて通れない道・・・。
と、いうことで今回は、VC++ & Unicode で開発しているプログラムで、全角文字の入力を制限することになった(仕様の関係で)。
Shift-JIS では散々やったが、Unicode か・・・。
Unicode 上では半角とか全角とか、そんなんないんだけどドーヨ?と、思ったが当然 API は存在した。
GetStringTypeEx という API で、こんなかんじ。
ちなみに、↑のドキュメントは 半角と全角の定数名が逆になっているので注意。
明らかに間違いです、、C3_HALFWIDTH が半角です・・・(動かして確認した)。
API だけ紹介しても意味ないですよお兄さん!
と、いうことで以下の感じで実装。
追記 2009.06.12: このページへの訪問がおおいので、サンプルコードを書いてみました。
// 文字列がすべて半角か確認する
BOOL IsAllHankaku( const TCHAR* pTarget, int nLen )
{
// 文字の種別を取得する
WORD* pType = new WORD[ nLen ];
GetStringTypeEx(
LOCALE_SYSTEM_DEFAULT // ユニコード版プロジェクトでは、無視される引数
,CT_CTYPE3 // 全角、半角、ひらがな等を判定するタイプ
,pTarget // 判定対象となる文字配列
,nLen // 判定対象となる文字配列のサイズ
,pType // 判定結果の配列
);// 結果がすべて半角なら TRUE をかえす
BOOL isAllHankaku = TRUE;
for( int i = 0; i < nLen; i++ ){
if( !(pType[i] & C3_HALFWIDTH) ){
isAllHankaku = FALSE;
break;
}
}delete [] pType;
return isAllHankaku;
}int _tmain(int argc, _TCHAR* argv[])
{
// ロケール設定
std::wcin.imbue( std::locale("japanese") );
std::wcout.imbue( std::locale("japanese") );
std::wcout << _T("文字列を入力してください:");
std::wstring szTarget;
std::wcin >> szTarget;
// 上記の関数を呼び出しBOOL isAllHan = IsAllHankaku( szTarget.c_str(), szTarget.length() );
if( isAllHan ){
std::wcout
<< _T("この文字列は、すべて半角文字です:")
<< szTarget
<< std::endl;
}
else{
std::wcout
<< _T("この文字列には、全角文字が含まれています:")
<< szTarget
<< std::endl;
}return 0;
}
なんともない、楽勝である。