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

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

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

Re[10]: 文字列の全角半角判定 [1]


(過去ログ 17 を表示中)

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

■6411 / inTopicNo.21)  Re[6]: 文字列の全角半角判定
  
□投稿者/ Jitta (394回)-(2007/08/10(Fri) 07:22:26)
No6409 (hei さん) に返信


WORD を起動し、適当に日本語の文字、漢字やひらがなを入力してください。それを選択して、コンテキストメニューから フォント を選択。左から2つ目、文字の幅とか書いてあるタブを選択。100% となっているのを 50% に変更して OK 。
半角漢字の出来上がり。


全角半角は、こういう表示上占める範囲を表す場合と、一文字が何バイトでできているかを表す場合があります。前者はプロポーショナルフォントの出現で意味を失い、後者はUTF-16では一定、UTF-8では3倍角や4倍角もありえる。


なので、中さんの最初の返信に戻る。
引用返信 編集キー/
■6414 / inTopicNo.22)  Re[7]: 文字列の全角半角判定
□投稿者/ 中博俊 (1141回)-(2007/08/10(Fri) 09:27:24)
中博俊 さんの Web サイト
無限ループしてるお。
YuOさんの言うフォントの世界だけでしか意味がないという話は
Centuryにして、IとWにした場合どうなるのか聞いてみたい。
Iが半角以下だと思うわけだが。

外字には半角とか全角の区切りあったかなー
ASCIIの0x00-0x1Fは 無角?

無駄に混ぜ返していると思うかもしれないけど、文字処理についてはそれだけ日本人みんなが真剣に向き合わなければいけないのです。

引用返信 編集キー/
■6437 / inTopicNo.23)  Re[8]: 文字列の全角半角判定
□投稿者/ Jitta (397回)-(2007/08/10(Fri) 18:28:59)
No6414 (中博俊 さん) に返信
> 無限ループしてるお。
なぜ定義するか分かれば、ブレークするお?
引用返信 編集キー/
■6443 / inTopicNo.24)  Re[9]: 文字列の全角半角判定
□投稿者/ hei (5回)-(2007/08/11(Sat) 00:10:52)
話がかみ合いませんね(^^;

No6410 (YuO さん) に返信
> そもそも,文字を扱う上での「全角」とか「半角」って何ですか?
> 混在する,というのは「全角」とか「半角」というものが存在することが前提だと思うのですが,
> そもそもその前提に対して異なる立場の人に対して前提を押し通そうとしているから話が通じていないのだと思います。

頻繁に出てくる文字で例を挙げます。
全角とは「0123456789」で、
半角とは「0123456789」です(あえて断言します)。

># ちなみに私は,「全角」「半角」はフォントの世界だけの話だと思っていて,
>文字集合や文字コードとは一切の関係を持たないと考えています。

例えばユーザーが入力した郵便番号を処理するとします。
ユーザーが入力した「123−4567」と「123-4567」は違う郵便番号ですか?
これらの文字を対比するときに使う用語は、
一般に「全角の数字・半角の数字」ではないですか?

私はアルバイトが入力したデータをチェック・整形するツールも作っていますが、
日本語のキーボードは全く同じ文字を表現するのに、
一般に「全角半角」という異なった文字を出力するので
これらのチェック・変換は頻繁に行っています。

全角・半角とは何かの厳密な定義は学者などが行えばよくて、
現場のプログラマがするべきことは、
「123−4567」と「123-4567」を同じ郵便番号とみなすことだと思うのです。
おそらく質問者もこのような必要性があって質問したのだと思います。
(■No6362の報告すらもないのは残念ですが)
みなさんも、定義がどうではなくこのような処理はやってるのではと思います。

No6411 (Jitta さん) に返信
>前者はプロポーショナルフォントの出現で意味を失い、
>後者はUTF-16では一定、UTF-8では3倍角や4倍角もありえる。
前者を半角と呼ぶのは初めて聞きました。しかし実務で問題になることはないでしょう。
後者に関しては私の知識不足があるかと思いますが、
unicodeではバイト数で管理するより文字数で管理するほうが普通ではないでしょうか?


私はこれまで学んできた中で、
全角半角のチェック・変換の質問には「VBのStrConv関数だよ」という
解説・回答はたくさん見てきましたが、
ここまで「厳密な定義」にこだわった意見にあったのは初めてです。
もちろんそれなりの意味があるのでしょうが、
結局理解できませんでした。
引用返信 編集キー/
■6444 / inTopicNo.25)  Re[10]: 文字列の全角半角判定
□投稿者/ ぽぴ王子 (251回)-(2007/08/11(Sat) 01:29:18)
ぽぴ王子 さんの Web サイト
とりあえずこれ以上話したいなら別スレを立てていただいていいでしょうかね。

heiさんの言い分もわかるし、中さんの話も(現実的かどうかは別として)わからない
でもないのです。

ただね、このスレッドはそういう議論をするためのスレッドじゃなくて、たまたまそういう
流れになってしまったスレッドで、質問主置いてきぼりで勝手なことを言い合ってるだけ
なんじゃないのかなと。
そういう話をやめろとは言わないけれど、やるならやるで河岸を変えてやってくれると
うれしいなと思ったり。
質問主さんも、こうなっちゃうと出るに出れなくなっちゃうわけですし。

というわけで、質問主さんが見てるかどうかわからないけど、回答を。
ひろさんが
> Googleで「C# 全角文字 判定」で検索したら出てきますよ。
と書かれていたので、検索したらこのスレが一番上に出てくる罠。
いやいやそうじゃなくて。
一番楽なのは String.Length とShfit_JISでGetBytesした数が違っていたら全角が
混じっていると判断できるんじゃないかなと。
要するに
> MSDNで調べているのですが、一発で結果がわかるものが見当たりませんでした。
> もしありましたら教えていただけないでしょうか。
これには「ありません」という話でした。
# まぁあるのかもしれないけど、僕は知らないです
引用返信 編集キー/
■6519 / inTopicNo.26)  Re[10]: 文字列の全角半角判定
□投稿者/ Jitta (398回)-(2007/08/16(Thu) 21:44:58)
No6443 (hei さん) に返信
> ■No6411 (Jitta さん) に返信
> >前者はプロポーショナルフォントの出現で意味を失い、
> >後者はUTF-16では一定、UTF-8では3倍角や4倍角もありえる。
> 前者を半角と呼ぶのは初めて聞きました。しかし実務で問題になることはないでしょう。

 全角半角を、何で区別しますか?文字幅ですか?だったら一定しない環境もあるから無意味かも?...って話なんだけどなぁ。あ、文字幅で全角半角を区別するのがはじめてって?いや、元々、そういう意味の言葉なんだけど(^-^;
No6240 mあさんが調べてくださったところ参照
(蘊蓄:一太郎 Ver.8 ぐらいまでには、文字装飾として、「倍角」や「4倍角」がありました。倍角は縦:横が1:2、4倍角は全角の4倍の面積、つまり縦も横も2倍。今はフォント サイズで指定するのが一般的。)

 Web では、たとえば、"あ" で10文字分の幅を用意してあるところに "檄" を10文字表示しようとすると、10文字目が表示できないかもしれません。Web では「文字幅」による指定はできないため、注意する必要があるでしょう(em は、文字の高さです)。私のところでは、「表示しきれないよ〜」って問題が発生しました。
 Windows アプリケーションにしても、VS2005 で作成するものは、問題となりにくいでしょう。しかし、VS.NET 2003 までは、ラベルの幅を固定するのが標準でした。このため、エンド ユーザが標準で使用するフォントを変えていたり、DPI を変えている場合、問題となる可能性があります。実際、昔公開していたオンラインソフトで、「DPI を変えた環境で、ラベルの表示が切れます」というフィードバックをいただいたことがあります。

 このように、「何のためにチェックをしたいのか」によって、本当はいらないチェックかもしれない。本当はそのチェックでは問題があるかもしれない。そういう隠れた問題を洗い出したい、ってことです。「C#」のカテゴリですが、Web で、サーバ側を C# でやっているかもしれないじゃないですか。で、実際にチェックしたいところはクライアントとか。そういう質問も、過去にあったから、尋ねています。
 つまり、質問者をいぢめているわけではありません。過去に自分がであった問題を元に、「こういう問題もあるよ」という情報提供であり、補足要求なのです。


 ってことで、どうして定義にこだわるか、わかっていただけるでしょうか>質問者

安直に、Shift_JIS で1バイト文字、2バイト文字を区別したいなら、こんな感じ。ただし、Shift_JIS に変換できない文字がどう判断されるかは不明。キーボードでは入力できなくても、文字コード表からは入力できたり、ユーザ環境によっては外字が登録されていたりするからね。

No6406 より借用:
System.Text.Encoding hEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
string stTarget = "2468024680"
byte[] bBytes = hEncoding.GetBytes(stTarget);
// 半角を、Shift_JIS での1バイト文字と定義する
// 全角を、Shift_JIS での2バイト文字と定義する
// 文字数とバイト数が同じなら、1バイト文字のみ
// 文字数の2倍とバイト数が同じなら、2バイト文字のみ
// どちらでもないなら混在
if (stTarget.Length == bBytes.Length) {
// 1バイト文字のみ
} else if (stTarget.Length * 2 == bBytes.Length) {
// 2バイト文字のみ
} else {
// 混在
}

引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

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

管理者用

- Child Tree -