全角文字の先行バイトかを確認する方法は?

解決


TM  2004-08-09 11:58:05  No: 54167

再びお世話になります。

VC6でMFCダイアログベースの製作を行っています。

CString型の文字列(buf)の左側から、指定された文字数を取り出す際に、
その文字数で取り出すと全角文字をまたいでしまう場合はその全角文字の
手前で取り出したいのです。そこで、

CString buf="!プログラミング!";
//これから6文字を取り出す。「!」は半角です。
if( _ismbblead(buf[6]) != 0 )
    MessageBox(buf.Left(5));
else MessageBox(buf.Left(6));

のような記述をしているのですが、全角文字など関係なしに表示されて
しまいます。上記の記述の場合ならば「グ」は表示されないはずなのに、
「ロ」の後に変なものがついてきてしまいます。これをChar型などにし
てもなおりません。

_ismbbleadは全角文字の先行バイトかどうかを確認するものだと思い使
っていましたが、そもそもこれが間違っているのでしょうか?

こんなことで申し訳ありませんが、ご教授お願いいたします。


TM  2004-08-09 12:00:40  No: 54168

訂正です。

CString buf="!プログラミング!";
//これから6文字を取り出す。「!」は半角です。
if( _ismbblead(buf[5]) != 0 )
    MessageBox(buf.Left(5));
else MessageBox(buf.Left(6));

この記述でうまくいきません。


シャノン  2004-08-09 18:25:41  No: 54169

Shift-JIS のダブルバイト文字には、先行バイトとも後続バイトとも解釈できるものがあり、それ単体ではどちらか判別できません。
「グ」の先行バイト 0x83 は、例えば全角の「c」の後続バイトでもあります。
確実に判別するには、文字列の先頭から見てくるしか方法はありません。


シャノン  2004-08-09 18:57:22  No: 54170

今回のサンプルのように、一つの文字列から切り出す回数が
一回きりなのであれば、_ismbslead を使えば改善されるかもしれません。
これに文字列の先頭アドレスを渡せば、上記した「先頭から見てくる」を
勝手にやってくれます。


シャノン  2004-08-09 19:27:06  No: 54171

アセアセ;;

> 一つの文字列から切り出す回数が一回きりなのであれば
別に2回以上でも使えないことはありません。
ただ、前の方から見てくるので、_ismbblead と同じ感覚で、毎回
先頭を指定して呼ぶと、速度の低下がエラいことになりますよ、ということです。
2回以上にするならば、_ismbslead の第一引数には文字列の先頭ではなく、最近のチェックで確実に先行バイトだと判明している箇所を渡すべきですね。


TM  2004-08-10 02:18:48  No: 54172

シャノンさん、ご返答ありがとうございます。

切り出しが1回なので、ご指導の通り_ismbsleadを用いて、解決しました。まだまだ、勉強不足ですね。大変わかりやすくご指導して頂き感謝です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加