- PR -

コントロール名で使用不可("〒"、"&"、"#"など)の全角文字を探しています。

投稿者投稿内容
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-13 12:56
こんな感じですかねー?
コード:


public void Main() {
System.Text.Encoding sjis = System.Text.Encoding.GetEncoding(932);
for (int i = 0; i < 0x10000; i++) {
char c = (char)i;
int category = (int)char.GetUnicodeCategory(c);
switch (category) {
case 0 : case 1 : case 2 : case 3 : case 4 : case 9 :
case 16 : //サロゲートを省略 U+D800-U+DFFF
case 17 : //プライベート用文字を省略 U+E000-U+F8FF
continue;
}
byte[] bytes = sjis.GetBytes(new char[]{c});
bool isSjis = (bytes.Length == 1) && (bytes[0] == 0x3F) && (c != '?');
//Shift_jisに含まれていない文字は省略する際はコメントを外す
//if (!isSjis)
// continue;
string type;
switch (category) {
case 5 : case 6 : case 8 : case 15 : case 18 :
if (c == '_')
type = "非先# ";
else
type = isSjis ? "非先 " : "非先 *";
break;
default :
type = isSjis ? "禁  " : "禁  *";
break;
}
System.Console.WriteLine(string.Format("{0:X4} : {1} : {2}", i, type, c));
}
}



先頭に禁止されているのと完全禁止されているのを合わせてると、サロゲートとか抜いて11,400文字ほどになりますか。
Shift_jisに限定すると先頭禁止・完全禁止あわせて346字(制御文字等含む)。
完全禁止のShift_jisにおける2バイト文字限定で242文字。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-04-13 12:58 ]

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-04-13 13:10 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-13 20:34
引用:

正直なところ、コントロール名に使えない文字一覧を、自分で出力する方法がわかりません。
できれば、使えない文字一覧のようなもの、もしくはそれを出力する簡単なプログラムはないでしょうか?


無いなら作ればええやん。と思ったので、作ってアップしようかと思ったのですが、それじゃぁ面白くないので、作るまでの過程をアップします。

 ご呈示頂いているURにLは、Unicodeのカテゴリと、VB.NETおよびC#での命名規則がありました。ここで、

1.すべての文字のカテゴリをチェックして、OKなものは印字する

ということをすれば、『コントロール名に使えない文字一覧を、自分で出力する』の逆が出来ますよね。ここで「使える」ものをチェックするのは、使えないものの中に非印字文字があるかもしれないからです。
 これをプログラムコードにするために、コード化できそうなくらいに細分化します。

 まず、「すべての文字」ですが、ループを使えばいけそうです。
 次に「文字のカテゴリをチェック」です。これはチェックして、結果を何かの変数に入れておけばいいでしょう。
 そして「OKなもの」です。これはIF文ですね。
 最後に「印字する」です。ここではSystem.Console.Writeメソッドを使いましょう。

 ここまでを、プログラムコードのように並べます。
コード:
すべての文字をループ
  カテゴリ = 文字のカテゴリをチェック()
  if カテゴリ = 使用可能 then System.Console.Write(文字)
ループの終わり



 ここで問題になるのが「文字のカテゴリをチェックする」ところです。そんなメソッドが用意されているなら、それを利用すればいいですよね。ということで、MSDNの検索機能を利用します。UnicodeCategory列挙体を示して頂いていますから、これを検索しましょう。きっとMSDN中には「このメソッドは文字のカテゴリを識別して、UnicodeCategory列挙体を返します」と書かれているはずです。ここで日本語の部分は不確定ですが、戻り値の型は書いてあるはずです。
 ということで検索すると、80件のトピックが見つかりました。タイトルを眺めると、「Char.GetUnicodeVategory メソッド」というのがあります。怪しそうです。ダブルクリックします。
引用:

Unicode 文字を UnicodeCategory 値のいずれかで識別されるグループに分類します。


ドンピシャです。これで「文字のカテゴリをチェックする」部分が出来ました。

 次の問題は「すべての文字をループ」です。すべての文字ですが、文字コードはどこからどこまであって、どうやって列挙すればいいのでしょうか。
 幸いなことに、先ほどの検索結果はChar構造体のメソッドでした。Char・・・キャラクタ・・・どうも文字と関係がありそうです。そこで、ドキュメントの下にある「Char 構造体」のリンクをクリックします。
引用:

Unicode 文字を表します。


これで良さそうです。書いてあることを読んでいくと、0x0000から0xffffの値(16bit整数値)を取るということ、IConvertibleを実装しているので、型の変換が出来るということがわかります。これでループも解決です。0x0000から0xffffまでの数値でループして、その数値をChar構造体に変換すればいけそうです。

 最後に「使用可能」の判断です。これは、上ではif文と書きましたが、switch(VB.NETではSelect)を使いましょう。使えるものだけcase句に列挙すればいいでしょう。

 あとは先の日本語プログラムを、VB.NETなりC#なりのコードに置き換えればいいと思います。
コード:
for (ushort i = 0x0000; i <= 0xffff; i++) {
	char c = (char) i;
	switch (Char.GetUnicodeCategory(c)) {
		case UnicodeCategory.UppercaseLetter
		, UnicodeCategory.LowercaseLetter
		, UnicodeCategory.TitlecaseLetter
		, UnicodeCategory.ModifierLetter
		, UnicodeCategory.OtherLetter
		, UnicodeCategory.LetterNumber:
			System.Console.WriteLine("先頭でも可 : " + c);
			break;
		case UnicodeCategory.NonSpacingMark
		, UnicodeCategory.SpacingCombiningMark
		, UnicodeCategory.DecimalDigitNumber
		, UnicodeCategory.ConnectorPunctuation
		, UnicodeCategory.Format:
			System.Console.WriteLine("途中なら可 : " + c);
			break;
	}
}


 これを書いたのは、考える順序、作る順序を学んで欲しいからです。プログラム作りは、中学や高校のテストと違って、参考書見放題です。しかし、最近の学校では教えてくれない、考えること、応用することを要求します。応用するためには、基本が必要です。基本の1つとして頂ければ幸いです。


_________________
ゆか
ベテラン
会議室デビュー日: 2004/04/06
投稿数: 75
投稿日時: 2005-04-15 09:33
みなさん、本当にありがとうございます。
自分で思っていたより、難しいようです。
そこで、時間を掛けて、勉強しながら作ってみたいと思います。
今後ともよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-17 15:13
引用:

ゆかさんの書き込み (2005-04-15 09:33) より:
みなさん、本当にありがとうございます。
自分で思っていたより、難しいようです。
そこで、時間を掛けて、勉強しながら作ってみたいと思います。
今後ともよろしくお願いします。


 難しいですか
 面倒をおかけして申し訳ないですが、どこが難しいと思うか、教えて頂けませんか?

 プログラミング初心者でもわかるように順を追って書いたつもりなのですが。
 MSDNから検索するのが難しい、それもよく聞きます。ですから、検索キーを選ぶヒントと、なぜそれを検索キーとするかを示したつもりです。
# 目指せMVP for MSDN < 注)そんなカテゴリはない

 私はオンライン・コミュニティから推薦されたMVPなので、オンラインでできる方法を教えられないなら、ちょっと問題なので、是非教えて頂けるよう、お願いします。

_________________

スキルアップ/キャリアアップ(JOB@IT)