文字列内に英語がふくまれているかの判定方法 – プログラミング – Home

文字列内に英語がふくまれているかの判定...
 
通知
すべてクリア

[解決済] 文字列内に英語がふくまれているかの判定方法


プログラム未熟者
 プログラム未熟者
(@プログラム未熟者)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

再びお世話になります。

.NET VC++ 2005です。

テキストボックス内の文字列に1文字でも英語が含まれていたらフォントを
英語にするというプログラムを書いてますが英語の判定方法を簡単に判別
出きる方法があればご教授ください。

現在は

array配列で英語判定である1~9,A~Z,a~z,!,&,()・・・等の英語文字を
全て配列で持たせて

substringで文字を1文字ずつチェックして上記のリストのいづれかに該当
する文字があったら英語フォントをセットする。それ以外だったら日本語
フォントにセットするというようなことをしています。

英語文字の数が多いので何か別の方法で判定出来ないかと探しております。

宜しければアドバイスください。


引用未解決
トピックタグ
ん?
 ん?
(@ん?)
ゲスト
結合: 17年前
投稿: 25
 

iswascii() は?


返信引用
プログラム未熟者
 プログラム未熟者
(@プログラム未熟者)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

>ん?さん

iswascii()は.NETでも使用できるのでしょうか?調べたところCの関数の
ようでしたので・・・。


返信引用
ん?
 ん?
(@ん?)
ゲスト
結合: 17年前
投稿: 25
 

http://msdn.microsoft.com/ja-jp/library/t9zea13t.aspx
このリンク先を読んで下さい。

# 制御文字コードが入って来るので、
# iswascii()だけだと駄目みたいですね。。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

.NETって、char型に変換すること出来ましたっけ?
出来るなら、0x30から0x7Eの範囲にあるかチェックすればいいと思います。


返信引用
KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
 

ToCharArray()でarray<wchar_t>^に変換できますね。
0x30から0x7Eじゃなくて0x20から0x7Eですね。

ちなみに、is***系の関数のたいていの実装は配列判定します。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

C++/CLIなら正規表現を使えば(String::ToCharArrayしないで)文字列配列に対して使える
でしょう。(Char::IsLetterあたりは解釈が微妙なので使用しないほうがよさげ)

String^ text = L1~9,A~Z,a~z,!,&,();
if (System::Text::RegularExpressions::Regex::IsMatch(text, L[\\u0030-\\u007e]))
{
// 含む



返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

何となくですが、まわり道をしているような。
要は2バイトコードが無かったら英語とみなしたい、そういうことでは?
だとしたら、
_ismbslead()
ismbstrail()
でいい気がします。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>ToCharArray()でarray<wchar_t>^に変換できますね。
>0x30から0x7Eじゃなくて0x20から0x7Eですね。
なるほど、変換可能ですか。
0x20からですね。失礼しました。
ただ、2バイト文字も対応するとなると考えないといけませんね。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

C++/CLIのString型の場合、内部ではUnicodeで持っているので、
ほぼすべてが2バイト文字のはずです。
(サロゲートペアは4バイト文字)

> _ismbslead()
> ismbstrail()
はマルチバイト文字のとき(WindowsならCP932の文字コードの文字のとき)
の関数なので、Unicode文字に対して使うのは間違っているでしょう。

CP932にエンコードしてやるという方法も、Unicodeで持っているものを変換するという
ことなのであまり好ましくはないでしょう。

ちなみにShift_JISでいう半角カタカナはUnicodeですと[\uff61-\uff9f]となります。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

Blueさん

> はマルチバイト文字のとき(WindowsならCP932の文字コードの文字のとき)
> の関数なので、Unicode文字に対して使うのは間違っているでしょう。
よく分かりました。

質問になってしまって申し訳ないのですが、
ユニコードの場合、マルチバイト文字で言うところの2バイト文字を区別する方
法は無いんでしょうか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>ユニコードの場合、マルチバイト文字で言うところの2バイト文字を区別する方
>法は無いんでしょうか?
前述どおり、Shift_JISコードの1バイトの文字に対応するUnicodeの文字コードで
判定するぐらいしかないでしょう。
(Shift_JISの2バイト文字がない=Shift_JISの1バイト文字だけある
=Unicodeの\u0000-\u007e,\uff61-\uff9fだけでの文字列である)

ちなみに、全角・半角の話だと文字コードは直接関係しないでしょう。


返信引用
プログラム未熟者
 プログラム未熟者
(@プログラム未熟者)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

>Blueさん

ありがとうございました。正規表現を使用してロジックをスマートに
することが出来ました。今回は正規表現についてはいろいろと勉強さ
せてもらいました。

また宜しくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました