はじめまして、上野と申します。
質問なのですが、文字列内に半角のカタカナが入っているかどうかを
調べたいのですが、どうすればいいのでしょうか?
(半角英数字は許可/半角カタカナは禁止(エラー表示)としたい)
よろしくおねがいいたします。
windowsXP VC++ MFC
文字コードで判定すればいいでしょう。
char型配列で文字列を持っている(CStringでプロジェクトが_MBCSであるならば)
Shift_JISコードになるので、半角カタカナのコードで判定すればいいです。
(文字を取り出すときは全角かどうか判定しないといけないですが、)
また、半角カタカナ一覧テーブルを作って、そこにない場合はOKとかにしてもいいと思います。
_ismbbkana で調べられます。
> _ismbbkana で調べられます。
あ、そんなのあったんですね。
でも、全角判定はしないといけなそうですけど。(_ismbblead)
返信遅くなりましてすみません。
今現在やりたいのはボタン押下時の処理なのですが、
・ボタン押下↓
・EditBoxに入力された文字を取得(CString型の変数に取得)↓
・取得した文字を1文字ずつ見ていく↓
・「半角カナ・ひらがな」があった場合はメッセージボックス表示
というものを作成したいのですが、_ismbbkanaを検索しても、
サンプルなどが見つからず困っています。
一応_ismbbkanaを使って処理を作成してみたのですが、
半角カナの場合でも0で返ってきてしまっている状態です。
もう少し自分でも調べてみますが、
もし参考サイト様などご存知でしたらご教授くださいますようお願いいたします。
> 一応_ismbbkanaを使って処理を作成してみたのですが、
> 半角カナの場合でも0で返ってきてしまっている状態です。
ここのソースを載せたほうが的確なアドバイスができると思います。
個人的には、チェック用関数をつくってあげて、戻り値で判定するようなつくりにします。
bool CheckKana( const CString data )
{
LPCTSTR p = data;
/* 文字列の終わりまで */
while ( *p )
{
if ( 半角カタカナである場合 )
{
return false;
}
/* 全角だったら、2文字分、
半角だったら、1文字分ポインタを進める */
???????
}
/* ここまでくると正常 */
return true;
}
> ・「半角カナ・ひらがな」があった場合はメッセージボックス表示
ひらがなもあったのね。。。
漢字とか全角英字とか全角カタカナはOKなのかな?
全角ひらがなを判定するには、それ用の関数はおそらく用意されていません。
文字コードで判定することになると思います。
連続で横からすんません。
for (unsigned char* p = text; *p; p = _mbsinc(p)) {
unsigned int c = _mbsnextc(p);
if (c < 0xff && _ismbbkana(c)) {
// 半角カナ
}
else if (_ismbchira(c)) {
// 全角ひらがな
}
else if (_ismbckata(c)) {
// 全角カタカナ
}
}
_ismbb*, _ismbc* というのを見てみると
意外といろんな種類が調べられることが分かりますよ。
mbstring.hを使わないでもいけるかなと思ったので、
_mbsincの存在は知っていましたが、あえて_ismbbleadで全角判定といっていたのですが、
_mbsnextcの存在は知らなかったです。
# いちいち、全角判定して、MAKEWORDしてた。。(´△` )アー
当然、_ismbchira,_ismbckataも知るわけもなく、
文字コードテーブル作って、下位バイトで判定していた罠。
Blueさん、dairygoodsさん、ありがとうございます。
Blueさんとdairygoodsさんから教えていただいたサンプルを元に
コーディング中なのですが、
dairygoodsさんのサンプルの中にある
>for (unsigned char* p = text; *p; p = _mbsinc(p))
という処理のtextという変数は何型なのでしょうか?
CStringの変数を入れてみたところ、
「CStringからunsigned char*に変換できません」というエラーがでてしまいました。
何か他の型に変換してからじゃないといけないのでしょうか?
CStringには LPCTSTR 用のキャスト用Operatorしかありません。
CString s( "1234" );
LPCTSTR p = s;
はできますが、
CString s( "1234" );
unsigned char* p = s;
はできないのは当然です。
でどうすればいいかというと
LPCTSTR(char*のtpyedef(ただし_MBCSのみ))からunsigned char* にキャストしてあげればいいです。
よって、
CString s( "1234" );
unsigned char* p = ( unsigned char* )( ( LPCTSTR )s );
const に真面目に付き合うと、
// Windows風 typedef
typedef const unsigned char* LPCMBSTR;
for (LPCMBSTR p = (LPCMBSTR)(LPCSTR)s; ...) {
とかが良いかも。
アドバイスありがとうございます;_;
LPCTSTR p = str;
for (unsigned char* us = ( unsigned char* )p; *us; us = _mbsinc(us)) {
unsigned int c = _mbsnextc(us);
if (c < 0xff && _ismbbkana(c)) {
// 半角カナの処理
// メッセージボックス表示
}
}
という処理になっているのですが、やはり半角カタカナの場合、
戻り値が0になっています…
全角カタカナだと戻り値が1…
なので、現状は、全角カタカナの場合のみ、メッセージボックスがでます…
どこかおかしな箇所ありますでしょうか??
> 戻り値が0になっています…
って、ドコに戻り値ありますか?(return文)
typedef const unsigned char* LPCMBSTR;
#define LPCMBSTR_CAST( s ) ( ( LPCMBSTR )( ( LPCSTR )s ) )
/////////////////////////////
bool CheckStr( const CString data )
{
for ( LPCMBSTR = LPCMBSTR_CAST( data ); *p; p = _mbsinc( p ) )
{
unsigned int c = _mbsnextc( p );
if ( c < 0xff && _ismbbkana( c ) ) return false; /* 半角カタカナ */
if ( _ismbchira( c ) ) return false; /* 全角ひらがな */
if ( _ismbckata( c ) ) return false; /* 全角カタカナ */
}
return true;
}
/////////////////////////////
CString s = "ABCカタカナ";
if ( !CheckStr( s ) )
{
AfxMessageBox( "エラー" );
}
else
{
・・・・・
}
> for ( LPCMBSTR = LPCMBSTR_CAST( data ); *p; p = _mbsinc( p ) )
pが抜けてました。
for ( LPCMBSTR p = LPCMBSTR_CAST( data ); *p; p = _mbsinc( p ) )
コンパイル通していないから、エラーがでたら臨機応変に対応してください。
どうやら、_ismbbkanaはマルチバイトにしか対応してないみたいですね…
> どうやら、_ismbbkanaはマルチバイトにしか対応してないみたいですね…
え?
どっからその結論になったのでしょうか?
入力文字列は Sfit_JIS ですよね?
> 入力文字列は Sfit_JIS ですよね?
Shift_JISでした。
試しにやってみたら、
ちゃんと "ハンカク" はMessageBox がでますよ。
どのような文字列を判定しようとしているのでしょうか?
当方UNICODEと使っていたのですが、
UNICODEに対応しているものを使わなければいけないみたいで…
(人に聞いただけですが…)
> char型配列で文字列を持っている(CStringでプロジェクトが_MBCSであるならば)
一番最初に聞いたつもりですが?
char型配列で文字列を持っている
↓
Shift_JISコード文字列
↓
UNICODE文字列ではない=wchar_t型配列でない=CStringでプロジェクトが_UNICODEになっている
ヤレヤレ┐(´ー` )┌
あ…あぁ…orz
ほんとすみません。。。;_;
> CStringでプロジェクトが_UNICODEになっている
じゃなくて
CStringでプロジェクトが_UNICODEになっていない
でした。
結局 _mbs〜 はなんのライブラリなのか分からず使っていたのが問題ですね。
MSDNに思いっきりコードページ932ってかいてあるんですけど。
解答する気が一気になくなったので、一番楽な解決法だけ紹介します。
Unicode文字列をShift_JISに変換して判定してください。
以上。
>Unicode文字列をShift_JISに変換して判定してください。
これだけはさけたいのでなんとか自力で頑張ります。
ありがとうございました。
そしてご迷惑おかけいたしました。
UNICODE については、GetStringTypeW で調べられそうな感じです。
たびたびすみせん。(質問ではないです)
結局、1文字ずつ文字コードと比較することにしました。
処理はまだ作成しておりませんが、これから比較方法など調べていこうと思います。
以上です。
ツイート | ![]() |