C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

半角カタカナかどうか判別したい


(過去ログ 2 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■2021 / inTopicNo.1)  半角カタカナかどうか判別したい
  
□投稿者/ いば 二等兵(1回)-(2005/11/29(Tue) 17:52:03)

分類:[C#] 


分類:[C#] 

2005/11/29(Tue) 18:44:15 編集(投稿者)


OS:WindowsXP SP2
IDE:Microsoft Visual C# .NET

いつもお世話になっています。
C#で半角カタカナかどうか判別したい場合の方法を教えてください。

一応自分なりに組んでみたのですが、ASCIIコード取得方法が分かりません。
(ASCIIコードを取得しその番号で判別しようとした)

===========================以下ソース==================================
public bool IsHankakuKatakana(string str)
{
  if (str.Length != 1) return false;

  System.Text.Encoding ASCII_Enc = System.Text.Encoding.GetEncoding("ASCII");

// このメソッドではASCIIコードは取得できない?
  int ascii_code = ASCII_Enc.GetBytes(str);

if (asc_code >= 161 And asc_code <= 223) {
return true;
} else {
return false;
}
}
=======================================================================

・文字のASCIIコードを知る方法
・これ以外に半角カタカナを判別する方法

どちらでも結構ですので、お知恵をお貸しください。

0
引用返信 編集キー/
■2023 / inTopicNo.2)  Re[1]: 半角カタカナかどうか判別したい
□投稿者/ 魔界の仮面弁士 大尉(41回)-(2005/11/29(Tue) 18:13:26)

分類:[C#] 

2005/11/29(Tue) 18:17:38 編集(投稿者)
2005/11/29(Tue) 18:14:25 編集(投稿者)

# 提示されたソースに、VB と C# が混在しているかのように見える…(汗)
## と思ったら、編集されて C# に直ってた。(^^;)
### と思ったけど、"And" → "&&" がまだ直ってなかったようで。


> IDE:Microsoft Visual C# .NET *****-***-*******-*****
プロダクト ID は公開しない方がよろしいかと。

> C#で半角カタカナかどうか判別したい場合の方法を教えてください。

System.Text.RegularExpressions.Regex いば
= new System.Text.RegularExpressions.Regex(@".*[\uff61-\uff9f].*");
private void textBox1_TextChanged(object sender, System.EventArgs e)
{label1.Text = いば.IsMatch(textBox1.Text) ? "あり" : "なし";}

0
引用返信 編集キー/
■2024 / inTopicNo.3)  Re[1]: 半角カタカナかどうか判別したい
□投稿者/ まどか 少将(61回)-(2005/11/29(Tue) 18:14:59)

分類:[C#] 

> ASCIIコード取得方法が分かりません。
> (ASCIIコードを取得しその番号で判別しようとした)
>
>   System.Text.Encoding ASCII_Enc = System.Text.Encoding.GetEncoding("ASCII");

明示的にShift_JISもしくはEncoding.Defaultでいいかと思います。

> // このメソッドではASCIIコードは取得できない?
>   int ascii_code = ASCII_Enc.GetBytes(str);

GetBytesはバイト配列を返します。
1文字単位で呼び出せば半角か全角かがわかると思います。GetUpperBound
カタカナかどうかは定数で判断するしかないかな?。。。

0
引用返信 編集キー/
■2025 / inTopicNo.4)  Re[2]: 半角カタカナかどうか判別したい
□投稿者/ まどか 少将(62回)-(2005/11/29(Tue) 18:17:16)

分類:[C#] 

> = new System.Text.RegularExpressions.Regex(@".*[\uff61-\uff9f].*");

正規表現か。。。勉強せなあかんな(汗

0
引用返信 編集キー/
■2027 / inTopicNo.5)  Re[1]: 半角カタカナかどうか判別したい
□投稿者/ いば 二等兵(3回)-(2005/11/29(Tue) 18:43:25)

分類:[C#] 

現在はソースが以下のように変わっています。
TextBoxとボタンしかないダイアログを表示して、ボタンを押すと
TextBoxのテキストを取るようになっています。

これだと、半角カタカナを入力しても「それ以外です」といわれてしまいます。

private void button1_Click(object sender, System.EventArgs e)
{
string str = textBox1.Text;
ASCIIEncoding AE = new ASCIIEncoding();
char[] temp = str.ToCharArray();
for(int x=0; x < temp.Length; x++)
{
byte[] bc = AE.GetBytes(temp[x].ToString());
if(bc[0] >= 161 && bc[0] <= 223) {
MessageBox.Show("半角カタカナです!");
} else {
MessageBox.Show("それ以外です!");
}
}
}


0
引用返信 編集キー/
■2028 / inTopicNo.6)  Re[3]: 半角カタカナかどうか判別したい
□投稿者/ いば 二等兵(4回)-(2005/11/29(Tue) 19:05:42)

分類:[C#] 

2005/11/29(Tue) 19:14:52 編集(投稿者)

<pre>ブラウザの更新ボタンを押してなかったので、直前の書き込みは重ねて質問の
ようになってしまい、申し訳ありません。

まどかさん

 返信ありがとうございます。僕はまだバイトコードを理解できていません。
 バイトデータ!=文字(ASCII)コードなのですよね?まだ意味が分かりません。
 Unicode(UTF8)では文字が最終的には2〜3バイトで表されるのは理解していますが、
 ASCIIコードのバイトデータと、Unicodeのバイトデータって違うのかとか、
 むむむという感じです。

魔界の仮面弁士さん>

 書いていて「しまった〜」と思った部分全てに的確に突っ込んでくださっていたので、
 思わず職場で声を出して笑ってしまいました。(^_^;)
 バラしますと、まず過去ログを拝見し、そこからASCIIコードで判別する方法を知り、
 そこのサンプルソースをコピーしてVisualStudioに貼り付けましたが、そこでコンパ
 イルせずに悩み、不明な点を調べていましたm(__)m。

後、プロダクトIDの件、ご指摘ありがとうございました!あれがIDだと気づかず
 コピペしていました。まさかVisualStudioの[ヘルプ]-[バージョン情報]-[情報のコ
 ピー]でIDまでコピーされるとは・・orz  今後気をつけます。

 ところで提示してくださったソースですが、正規表現の部分で3つ分かりません。
 (@".*[\uff61-\uff9f].*");

  1)最初と最後の.*(任意文字が0文字以上)はなぜ必要なのでしょうか?
  2)ff61と、ff9fはASCIIの半角文字コードですか?
  3)¥Uとはどういう意味でしょうか?

 よろしければ教えて頂けますでしょうか。
</pre>


0
引用返信 編集キー/
■2030 / inTopicNo.7)  Re[4]: 半角カタカナかどうか判別したい
□投稿者/ いば 一等兵(6回)-(2005/11/29(Tue) 19:26:16)

分類:[C#] 

魔界の仮面弁士さん、いつも助けて頂いてありがとうございます。
閲覧する方のために最終的なソースを上げておきます。

=====================以下ソース==============================
using System.Text;

private void button1_Click(object sender, System.EventArgs e)
{
string str = textBox1.Text;
System.Text.RegularExpressions.Regex regex_hankana = new System.Text.RegularExpressions.Regex(@".*[\uff61-\uff9f].*");
if(regex_hankana.IsMatch(str)) {
MessageBox.Show("半角カタカナです!");
}
}


解決済み
引用返信 編集キー/
■2031 / inTopicNo.8)  Re[4]: 半角カタカナかどうか判別したい
□投稿者/ 魔界の仮面弁士 大尉(42回)-(2005/11/29(Tue) 21:29:29)

分類:[C#] 

2005/11/29(Tue) 23:08:45 編集(投稿者)

>  Unicode(UTF8)では文字が最終的には2〜3バイトで表されるのは理解していますが、
UTF-8の文字は、最小1バイト、最大6バイトですよ。
たとえば、"a"は1バイト、"а"は2バイト、"a"は3バイトですね。

# もっとも、.NET では 4バイト以下の文字しか扱われませんけど。


>  ASCIIコードのバイトデータと、Unicodeのバイトデータって違うのかとか、
ASCII は 7bitの符号化文字集合であり、制御文字を除いた表示可能文字は
94個しかありませんが、Unicode は6万5千を超える文字が扱えます。(※1)
そういう意味では別のバイナリといえるでしょう。

ただし、Unicode で定義された文字の中でも、基本ラテン文字ブロックの文字に関しては、
そのまま ASCII コードに対応しているため、ASCII は UTF-8 のサブセットであるとも
言えます。その意味では同じバイナリという見方も出来るかもしれませんね。


>   1)最初と最後の.*(任意文字が0文字以上)はなぜ必要なのでしょうか?
すみません、不要です。(汗)
たとえば、a〜dのいずれかを含むデータの検索なら、@"[a-d]" で十分です。

こういう時、VB では「If X Like "*[a-d]*" Then」のように書くので、
その表現に釣られてしまいました。(^^; <普段、VBばかり使っているので…


>   2)ff61と、ff9fはASCIIの半角文字コードですか?
ASCII に、いわゆる半角カナの文字はありませんよ。

Unicode において、U+FF00〜U+FFEF のブロックは
『半角・全角形(Halfwidth and Fullwidth Forms)』と呼ばれます。

このブロックに、Shift_JIS の「いわゆる半角カナ」に相当する文字が
含まれており、その範囲は U+FF61〜U+FFEF になっています。


>   3)¥Uとはどういう意味でしょうか?
C# の文字列でいう所の「\u」と同じ意味です。(※2)

なお、ff61〜ff9fの範囲が、どのような文字を意味しているのかは、
 textBox1.AppendText("\xff61");
 textBox1.AppendText("\xff62");
      :
 textBox1.AppendText("\xff9e");
 textBox1.AppendText("\xff9f");
などのようにして確認できますね。




(※1) .NETのヘルプでは、 65,000 以上の文字に対応している…と書かれていますが、
"Unicode 3.0" (これは WinXP で採用されています) で定義されている文字は、
49,194 個だけです。(ただし、Unicode 4.0 では 96,883 個の文字が定義されています)

(※2) 正規表現の \u 、および C# の \u や \x の意味については、下記をご覧下さい。
http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconcharacterescapes.asp
http://www.microsoft.com/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_2_4_1.asp
http://www.microsoft.com/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_2_4_4_5.asp

0
引用返信 編集キー/
■2032 / inTopicNo.9)  Re[5]: 半角カタカナかどうか判別したい
□投稿者/ 魔界の仮面弁士 大尉(43回)-(2005/11/29(Tue) 22:35:36)

分類:[C#] 

> System.Text.RegularExpressions.Regex regex_hankana = new System.Text.RegularExpressions.Regex(@".*[\uff61-\uff9f].*");
> if(regex_hankana.IsMatch(str)) {
> MessageBox.Show("半角カタカナです!");
> }

この場合は、下記の 2. のパターンに一致しますね。

1. 「半角カタカナだけの文字列」
2. 「半角カタカナを含む文字列」
3. 「半角カタカナを含まない文字列」

0
引用返信 編集キー/
■2034 / inTopicNo.10)  Re[5]: 半角カタカナかどうか判別したい
□投稿者/ いば 一等兵(7回)-(2005/11/30(Wed) 15:20:35)

分類:[C#] 

お返事遅くなりまして申し訳ありません。少し前に拝見しました。
いつも丁寧に教えてくださいまして、ありがとうございます。
ひととおり読破した上で、再度質問をさせてください。

■UTF−8の仕様について
半角英数=1Byte、全角かなカナ漢字=3Byte、半角カナ=3Byteと、
誤って捉えていました。ありがとうございます。

■¥Uについて
教えていただいたサイト(※1)では、Unicodeを表すエスケープシーケンスという説明がありました。
※1:http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_2_4_1.asp

一方、自分でぐぐって見つけたサイト(※2)では、正規表現で[A-Z]以外を表す
記号と書いてありました(EmEditorの正規表現ですがPerl準拠と書いてありました)
http://www.emeditor.com/jp/help/howto/search/search_regexp_syntax.htm

ところが、[Perl 正規表現]でぐぐっても、Perlの正規表現に\u という表記がある
事について書かれたサイトがありませんでした(見つけられませんでした)。

http://jyokke.hp.infoseek.co.jp/web/perl/perl_09_RegularExpression.html
http://www.kt.rim.or.jp/~kbk/regex/regex.html

という事で、C#における¥Uは、エスケープシーケンスなのか(多分これだと考えてます)、正規表現のメタ文字なのか、それともエスケープシーケンス=メタ文字なのか、とても混乱しています。

■ASCIIコードに半角カタカナが含まれない件
http://f57.aaa.livedoor.jp/~jeanne/bbs/srch.cgi?no=0&word=%94%BC%8Ap%83J%83%5E%83J%83i&andor=and&logs=all&PAGE=20
ごめんなさい、上記記事のVBサンプルソースで使用されているASCの意味を調べて、
てっきりそこでASC関数は渡された文字列の先頭文字のASCIIコードを表すものだと
勘違いしてしまいました。

ASCIIコードとは、アメリカで定められた文字コード体系なんですね。
だからそもそも[かな]や[カナ]は存在しないという事ですね。
(含まれるのはローマ字、数字、記号、制御文字)

だいぶ文字コードについて分かってきました。
というよりこれを知らずしてコーディングしていたのが少し恥ずかしいです。

勉強のつもりでUnicodeコンソーシアム(http://www.unicode.org/charts/)へ行き
Unicodeの半角カタカナを含む文字コード表を見ようとしたのですが、どこを見れ
ば良いのか分かりませんでした。
魔界の仮面弁士さんは、どのようにしてUnicodeの半角カナ文字コードの範囲を
調べたのでしょうか?



0
引用返信 編集キー/
■2036 / inTopicNo.11)  Re[6]: Unicode文字コード表の場所
□投稿者/ いば 一等兵(8回)-(2005/11/30(Wed) 16:14:10)

分類:[C#] 

すみません、自己レスです。

Unicodeの文字コード表は、

Unicodeコンソーシアムのホーム(http://www.unicode.org/)右上の、
[Code Charts]というリンクを辿ったページの、
[Japanese-specific]の下にありました。

ちなみに半角カタカナは[Halfwidth Katakana]ですね。


0
引用返信 編集キー/
■2037 / inTopicNo.12)  Re[6]: 半角カタカナかどうか判別したい
□投稿者/ 魔界の仮面弁士 大尉(44回)-(2005/11/30(Wed) 16:45:48)

分類:[C#] 

> という事で、C#における¥Uは、
"¥U" → "\u" ですね。
C#は大文字小文字を区別する言語ですが、半角全角も
同様に区別されます。正しく使い分けましょう。

> という事で、C#における¥Uは、エスケープシーケンスなのか(多分これだと考えてます)、正規表現のメタ文字なのか、それともエスケープシーケンス=メタ文字なのか、とても混乱しています。

たとえば、下記はいずれも同じ内容『C#』を意味します。
string a = "C#";
string b = "\u0043\u0023";
string c = "\x43\x23";
string d = "\x0043\x0023";

一方、先頭に @ を付けた場合には、エスケープされる事なく、「\」を含んだ
そのままの文字列が渡されます。ここまではよろしいでしょうか。
string A = @"C#";
string B = @"\u0043\u0023";
string C = @"\x43\x23";
string D = @"\x0043\x0023";


で、正規表現の場合に話を戻すと、こうなります。
Regex r1 = new Regex("\\u0043\\u0023");
Regex r2 = new Regex(@"\u0043\u0023");
Regex r3 = new Regex("\u0043\u0023");
Regex r4 = new Regex("C#");
Regex r5 = new Regex(@"C#");
いずれも、『C#』という文字列に対して一致する正規表現ですが、
r1 と r2 には、「\u0043\u0023」という文字列が指定されていて、
r3, r4, r5 には「C#」という文字列が指定されている事になります。


> 勉強のつもりでUnicodeコンソーシアム(http://www.unicode.org/charts/)へ行き
> Unicodeの半角カタカナを含む文字コード表を見ようとしたのですが、どこを見れ
> ば良いのか分かりませんでした。
既に見つけられたようですが、一応貼っておきます。

(半角・全角形ブロック)
http://www.unicode.org/charts/PDF/UFF00.pdf
(東アジアのエンコーディング群と文字集合との変換表)
http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/
(文字幅プロパティに関する情報)
http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt

# 簡易的に調べるだけなら、Windows アクセサリの「文字コード表」で、
# 検索ボックスに「Halfwidth」と入れてみると、関連文字がヒットします。

0
引用返信 編集キー/
■2045 / inTopicNo.13)  Re[7]: 半角カタカナかどうか判別したい
□投稿者/ いば 一等兵(9回)-(2005/11/30(Wed) 21:06:48)

分類:[C#] 

ありがとうございます。だいぶ理解できました。

>たとえば、下記はいずれも同じ内容『C#』を意味します。
>string a = "C#";
>string b = "\u0043\u0023";
>string c = "\x43\x23";
>string d = "\x0043\x0023";

 エスケープシーケンスとは、特殊な意味を表す、文字列の並びに過ぎないんですね。
 ネット上には、メタ文字、エスケープシーケンス、メタキャラ等色々な用語が使われていますが、
 結局のところ同じような意味で、特定の文字並びを意味のある記号として各ソフトウェアが解釈
 してるだけのことなんですよね。

 例えば、Perlの\nと、Cの\nが同じ意味なのは、そうなるようにPerl.exeとCコンパイラが作られ
 ているから、というだけの話なんですね。

 そういう意味で言うと、\u,\xというのは、Perlで用意された正規表現のエスケープシーケンスで
 はなく、C#で用意された、Unicodeを意味するエスケープシーケンスなのですね。

>一方、先頭に @ を付けた場合には、エスケープされる事なく、「\」を含んだ
>そのままの文字列が渡されます。ここまではよろしいでしょうか。

 はい、それは大丈夫です。パス指定の際にもよく使いますので。

>で、正規表現の場合に話を戻すと、こうなります。
>Regex r1 = new Regex("\\u0043\\u0023");
>Regex r2 = new Regex(@"\u0043\u0023");
>Regex r3 = new Regex("\u0043\u0023");
>Regex r4 = new Regex("C#");
>Regex r5 = new Regex(@"C#");
>いずれも、『C#』という文字列に対して一致する正規表現ですが、
>r1 と r2 には、「\u0043\u0023」という文字列が指定されていて、
>r3, r4, r5 には「C#」という文字列が指定されている事になります。

 はい、この点は完全に理解できました。ありがとうございます。

># 簡易的に調べるだけなら、Windows アクセサリの「文字コード表」で、
># 検索ボックスに「Halfwidth」と入れてみると、関連文字がヒットします。

 これ使いました!すごく便利ですね。こんな身近に良いツールがあったなんて・・。
 [検索する文字の名前]というテキストボックスに[Halfwidth]と打ち込んだらバッチリ半角カナが
 出てきました。

 度重なる質問に最後までお答え頂きまして本当にありがとうございました。


0
引用返信 編集キー/
■2046 / inTopicNo.14)  Re[8]: 半角カタカナかどうか判別したい
□投稿者/ いば 伍長(10回)-(2005/11/30(Wed) 21:08:18)

分類:[C#] 

すみません、トピック表示の解決欄にチェックがされないので、
解決チェックします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -