再びお世話になります。
.NET VC++ 2005です。
テキストボックス内の文字列に1文字でも英語が含まれていたらフォントを
英語にするというプログラムを書いてますが英語の判定方法を簡単に判別
出きる方法があればご教授ください。
現在は
array配列で英語判定である1~9,A~Z,a~z,!,&,()・・・等の英語文字を
全て配列で持たせて
substringで文字を1文字ずつチェックして上記のリストのいづれかに該当
する文字があったら英語フォントをセットする。それ以外だったら日本語
フォントにセットするというようなことをしています。
英語文字の数が多いので何か別の方法で判定出来ないかと探しております。
宜しければアドバイスください。
iswascii() は?
>ん?さん
iswascii()は.NETでも使用できるのでしょうか?調べたところCの関数の
ようでしたので・・・。
http://msdn.microsoft.com/ja-jp/library/t9zea13t.aspx
このリンク先を読んで下さい。
# 制御文字コードが入って来るので、
# iswascii()だけだと駄目みたいですね。。
.NETって、char型に変換すること出来ましたっけ?
出来るなら、0x30から0x7Eの範囲にあるかチェックすればいいと思います。
ToCharArray()でarray<wchar_t>^に変換できますね。
0x30から0x7Eじゃなくて0x20から0x7Eですね。
ちなみに、is***系の関数のたいていの実装は配列判定します。
C++/CLIなら正規表現を使えば(String::ToCharArrayしないで)文字列配列に対して使える
でしょう。(Char::IsLetterあたりは解釈が微妙なので使用しないほうがよさげ)
String^ text = L1~9,A~Z,a~z,!,&,();
if (System::Text::RegularExpressions::Regex::IsMatch(text, L[\\u0030-\\u007e]))
{
// 含む
・
・
・
何となくですが、まわり道をしているような。
要は2バイトコードが無かったら英語とみなしたい、そういうことでは?
だとしたら、
_ismbslead()
ismbstrail()
でいい気がします。
>ToCharArray()でarray<wchar_t>^に変換できますね。
>0x30から0x7Eじゃなくて0x20から0x7Eですね。
なるほど、変換可能ですか。
0x20からですね。失礼しました。
ただ、2バイト文字も対応するとなると考えないといけませんね。
C++/CLIのString型の場合、内部ではUnicodeで持っているので、
ほぼすべてが2バイト文字のはずです。
(サロゲートペアは4バイト文字)
> _ismbslead()
> ismbstrail()
はマルチバイト文字のとき(WindowsならCP932の文字コードの文字のとき)
の関数なので、Unicode文字に対して使うのは間違っているでしょう。
CP932にエンコードしてやるという方法も、Unicodeで持っているものを変換するという
ことなのであまり好ましくはないでしょう。
ちなみにShift_JISでいう半角カタカナはUnicodeですと[\uff61-\uff9f]となります。
Blueさん
> はマルチバイト文字のとき(WindowsならCP932の文字コードの文字のとき)
> の関数なので、Unicode文字に対して使うのは間違っているでしょう。
よく分かりました。
質問になってしまって申し訳ないのですが、
ユニコードの場合、マルチバイト文字で言うところの2バイト文字を区別する方
法は無いんでしょうか?
>ユニコードの場合、マルチバイト文字で言うところの2バイト文字を区別する方
>法は無いんでしょうか?
前述どおり、Shift_JISコードの1バイトの文字に対応するUnicodeの文字コードで
判定するぐらいしかないでしょう。
(Shift_JISの2バイト文字がない=Shift_JISの1バイト文字だけある
=Unicodeの\u0000-\u007e,\uff61-\uff9fだけでの文字列である)
ちなみに、全角・半角の話だと文字コードは直接関係しないでしょう。
>Blueさん
ありがとうございました。正規表現を使用してロジックをスマートに
することが出来ました。今回は正規表現についてはいろいろと勉強さ
せてもらいました。
また宜しくお願いします。