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

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

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

Re[6]: 文字が全角か半角か判定する方法は?


(過去ログ 38 を表示中)

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

■19827 / inTopicNo.1)  文字が全角か半角か判定する方法は?
  
□投稿者/ シャノン (447回)-(2008/05/30(Fri) 17:42:29)

分類:[.NET 全般] 

# 遭えて炎上しそうなタイトルをセレクトw

えー、タイトルの通りです。
対象の文字は System.Text.Encoding で扱える任意の文字、対象フォントは、FontDialog.FixedPitchOnly = true の場合に選択できる任意のフォントとし、「全角文字」とは、「半角文字」の2倍の幅を持つ文字とします。
「半角文字」の定義は何にしましょうか。コードポイント U+0041 の文字と同じ幅の文字、とか。

気になるのは、FontDialog.FixedPitchOnly を指定したからといって、選べるフォントの幅が必ずしも1:2の2種類になるわけではない、ということがありうるかどうか、です。
FixedPitchOnly が何を判断基準にしているのかわかりませんが、例えばフォントファイルの中にある特定の1ビットで識別しているとかいう場合、実体はプロポーショナルフォントなのに、そのビットが立っているというような、ヒネクレたフォントを作ることができるかもしれません。
が、そういうフォントを「作ることが可能かどうか」は問題にしないものとし、そういった(文字幅が1:2の2種類以外にもある)フォントが「ありふれているかどうか」を気にします。

対象環境は、Vista までの Windows + 3.5 までの .NET Framework および Windows API。要するになんでもアリで。
よろしくお願いします。
引用返信 編集キー/
■19831 / inTopicNo.2)  Re[1]: 文字が全角か半角か判定する方法は?
□投稿者/ ネタ好き (359回)-(2008/05/30(Fri) 18:04:51)
No19827 (シャノン さん) に返信
難しい話題ですね。確かUnicodeでは、大文字はプロパティ番号12、
小文字はプロパティ番号13で定められていたと思いますが、
この話題はそれと関係ありますか?
全然関係なかったらごめん。
引用返信 編集キー/
■19832 / inTopicNo.3)  Re[2]: 文字が全角か半角か判定する方法は?
□投稿者/ 鶏唐揚 (176回)-(2008/05/30(Fri) 18:10:51)
No19831 (ネタ好き さん) に返信
> ■No19827 (シャノン さん) に返信
> 難しい話題ですね。確かUnicodeでは、大文字はプロパティ番号12、
> 小文字はプロパティ番号13で定められていたと思いますが、
> この話題はそれと関係ありますか?
> 全然関係なかったらごめん。
大文字小文字じゃなくて半角全角では。
という私も正直わっけわかめです。プロパティ番号とかも知りませんw


#「文字を全角に変換してから元と比較して違ってたら半角」でいーんじゃなぁーいのぉー?
とか思ってた私は間違いなくたわけw
引用返信 編集キー/
■19834 / inTopicNo.4)  Re[3]: 文字が全角か半角か判定する方法は?
□投稿者/ ま (45回)-(2008/05/30(Fri) 18:47:32)
2008/05/30(Fri) 18:51:21 編集(投稿者)
http://support.microsoft.com/kb/417434/ja

WindowsXP では”半角”は”全角”の半分だけど、稀に1ドット異なる場合があり
これは仕様です、とのこと。回避するには中途半端な大きさの文字は避ける、みた
いですね。
【追記】
この記事めちゃくちゃ古いですね。でもGDIですから変更なしじゃないでしょうか。
何の根拠もありませんが。1ドットくらいいいじゃん、みたいな。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD> 
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE></TITLE>
<style>
span {
	border:solid 1px red;
}
.Fix1 {
	font-family:FixedSys;
	font-size:12px;
}
.Fix2 {
	font-family:monospace;
	font-size:13px;
}
.Fix4 {
	font-family:MS ゴシック;
	font-size:14px;
}
.Fix5 {
	font-family:MS 明朝;
	font-size:15px;

}
.Fix6 {
	font-family:HGS明朝B;
	font-size:16px;
}

.Fix55 {
	font-family:MS 明朝;
	font-size:14px;
}
</style>
</HEAD>
<BODY>
<p>FixedSys</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix1">A12wiえおm</span><br />
	<span class="Fix1">A12wieom</span>
</div>
<p>monospace</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix2">A12wiえおm</span><br />
	<span class="Fix2">A12wieom</span>
</div>
<p>MS ゴシック</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix4">A12wiえおm</span>96<br />
	<span class="Fix4">A12wieom</span>
</div>
<p>MS 明朝</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix5">A12wiえおm</span>96<br />
	<span class="Fix5">A12wieom</span>
</div>
<p>HGS明朝B</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix6">A12wiえおm</span><br />
	<span class="Fix6">A12wieom</span>
</div>

<p>---------------------ほんとに1ドット違うのかな-------------</p>
<p>MS 明朝</p>
<div onclick="alert(this.firstChild.offsetWidth+'::'+this.lastChild.offsetWidth)">
	<span class="Fix55">A12wiえおm</span>14*4,7*4<br />
	<span class="Fix55">A12wieom</span>
</div>

</BODY>
</HTML>


全部やるのは無理ですが怪しそうな名前のフォントだけ試してみました。
13・14pxが同じ占有幅です。
何か変です。フォントも違うのに。


引用返信 編集キー/
■19835 / inTopicNo.5)  Re[4]: 文字が全角か半角か判定する方法は?
□投稿者/ なちゃ (128回)-(2008/05/30(Fri) 19:02:36)
確かいつだったからか仕様が変わりませんでしたっけ?
中途半端なサイズは正確なサイズのと強制的に同じになるみたいな
引用返信 編集キー/
■19839 / inTopicNo.6)  Re[4]: 文字が全角か半角か判定する方法は?
□投稿者/ シャノン (448回)-(2008/05/30(Fri) 19:36:52)
No19834 (ま さん) に返信
あ、1ドットくらいは OK っす。
わざわざありがとうございます。
引用返信 編集キー/
■19841 / inTopicNo.7)  Re[5]: 文字が全角か半角か判定する方法は?
□投稿者/ 凪瀬 (49回)-(2008/05/30(Fri) 19:59:39)
凪瀬 さんの Web サイト
なんか過去に調べたような記憶があるなと思って探してみたら見つかりました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38248&forum=28&start=21
「WindowsXP、SunのJDK1.5のVM」なのでちょっと読み替えが必要だとは思うけど。参考になるかな?
引用返信 編集キー/
■19842 / inTopicNo.8)  Re[1]: 文字が全角か半角か判定する方法は?
□投稿者/ NyaRuRu (42回)-(2008/05/30(Fri) 20:33:30)
No19827 (シャノン さん) に返信
> # 遭えて炎上しそうなタイトルをセレクトw
>
> が、そういうフォントを「作ることが可能かどうか」は問題にしないものとし、そういった(文字幅が1:2の2種類以外にもある)フォントが「ありふれているかどうか」を気にします。
>
> 対象環境は、Vista までの Windows + 3.5 までの .NET Framework および Windows API。要するになんでもアリで。

よく分からんのですが,「ありふれているかどうか」が気になるなら,とりあえず GDI なり GDI+ なり FreeType なりを使って情報を収集するコードを書いて,あとはいかに広く情報を集められるかが肝なんじゃないですかね?
別に多数決で「ありふれているかどうか」を決めたいというわけではないんですよね?
引用返信 編集キー/
■19853 / inTopicNo.9)  Re[2]: 文字が全角か半角か判定する方法は?
□投稿者/ ネタ好き (360回)-(2008/05/30(Fri) 23:33:46)
2008/05/31(Sat) 00:17:06 編集(投稿者)

だんだん思い出してきたぞぉー。
確か半角とは、本来ワープロなどで同じ文字を半分の大きさで印字する事であって、
規格的に全角と半角が決まっているわけではないんですよね。
※自分で思い出すために書いてあるので、シャノンさんちょっと我慢してね。
全角とは漢字を正方形にした時の名称で、半角は1:0.5にしたフォントが多かったからですよね。
でもこれは偶然であり、プロポーショナルフォントではひらがなですら字幅が違う。
さてはシャノンさん、宗教戦争をお望みなのかw
処理系によっては表示できないし、1つの文字が2つ在るのはおかしいとか、
検索できねぇとか言われて、これ廃止した方がいいと言う人がいっぱい居たのに、
HALFWIDTH KATAKANAとしてUnicodeでどっこい生きてるですよね。
うーん本当にわかんないや。何で必要なのやら、もうそろそろ1つにして、印刷時に半分の大きさで印刷しようよw
えっと、このテーマ難しいな・・・
そうか!わかったぞ、2つの文字を並べて大きい方が「全角」、小さい方が「半角」で多分幅率なんて関係ないんだ。だから文字のメタデータを設定して機械的に、小さい方を半角、大きい方を全角にすればいいんだ。

誤字訂正しました。
引用返信 編集キー/
■19854 / inTopicNo.10)  Re[3]: 文字が全角か半角か判定する方法は?
□投稿者/ ネタ好き (361回)-(2008/05/30(Fri) 23:46:03)
2008/05/31(Sat) 00:03:15 編集(投稿者)

具体的な方法は・・・
1.文字コードのセット(アとア)などを格納する。
2.実際に2つの文字を線画する。
3.2つの画像の幅を比べる。
これでどうだ(笑)
1の時「人間が見比べて補足情報(全角フラグなど)を入れればいいんじゃん」という声は黙殺するw
さらに1の部分を画像判定処理にすれば全てPCで行える。
正確性には疑問あるけどねw
引用返信 編集キー/
■19859 / inTopicNo.11)  Re[1]: 文字が全角か半角か判定する方法は?
□投稿者/ れい (584回)-(2008/05/31(Sat) 04:08:55)
2008/05/31(Sat) 04:13:58 編集(投稿者)

検証したのはたぶんW2K時代で、ちょっと情報が古いかもしれませんが。

No19827 (シャノン さん) に返信
> FixedPitchOnly が何を判断基準にしているのかわかりませんが、

FixedPitchOnlyはCF_FIXEDPITCHONLYを指定してChooseFont()するのに相当し、
CF_FIXEDPITCHONLYはTrueTypeやOpenTypeフォントの場合、
フォントファイル内、OS/2テーブルのPanoseフィールドを見て判断しています。
4バイト目が「9」の場合FixedPitchOnlyなFontDialogで表示されます。

こういう仕組みになっていますが、ここに問題があります。

Panoseというのはフォントの分類法の一つです。
書体と数列を対応させ、「似た書体が似た数列になる」ようになっています。
TrueTypeやOpenTypeでは分類にこれを採用していて、
PanoseフィールドはこのPanose値をバイト列として記録しています。

Panose値の4つ目は「Proportion」という項目で、
「Modern(3)」「Expanded(5)」「Condensed(6)」「Monospaced(=9)」などが定義されています。
FixedPitchOnlyなフォントダイアログは、TrueTypeやOpenTypeに対しては
「Monospaced」なフォントのみを表示するという動作になるわけです。

他の値を見てもわかるように、
Monospacedというのは「なるべく同じ幅にみえるようそろえた書体」に過ぎません。
とくにタイポグラフィックな人にとっては。
実際、活版な時代からMonospaceという書体・用語はありましたし、
Panoseでは、「J」の幅÷「M」の幅が0.78以上の場合Monospacedであると定義されています。
全然「等幅」ではありません。

「FixedPitchOnly」という名称は現在ではおかしいのです。

> 例えばフォントファイルの中にある特定の1ビットで識別しているとかいう場合、実体はプロポーショナルフォントなのに、そのビットが立っているというような、ヒネクレたフォントを作ることができるかもしれません。
> が、そういうフォントを「作ることが可能かどうか」は問題にしないものとし、そういった(文字幅が1:2の2種類以外にもある)フォントが「ありふれているかどうか」を気にします。

Monospacedなフォントで各文字の大きさが違うのは、「可能」ですし「普通」です。
全く捻くれていません。
むしろ、全て同じ幅のフォントのほうがレアです。

> 気になるのは、FontDialog.FixedPitchOnly を指定したからといって、選べるフォントの幅が必ずしも1:2の2種類になるわけではない、ということがありうるかどうか、です。

上記のように、FontDialog.FixedPitchOnlyというのはMonospacedなフォントを表示するだけですから、
フォントの幅は様々なものがありえます。
ただし、活版からの伝統で、ひらがな・カタカナ・漢字・ハングルは同じサイズの正方形の外形に揃えることが殆どです。

(特に漢字圏の)情報処理な人からみると全て同じ幅だとか、2倍幅というのは特別な意味を持ちます。
#そういった書体はタイポグラフィックな人はMonospacedではなくFixedPitchと言います。
しかし、TrueTypeやOpenTypeではそれを明示したり指定したり保証する方法は在りません。
全ての文字について調べてみる他ありません。
#正確にはそれでもだめです。カーニングとかがあるので。

文字の描画にTrueTypeを使うようになった時点で、
「文字の幅」という概念は消えたということですね。
普通のプログラムを作る上で気にするべきは「文字列の幅」であると。

Panoseについては http://www.panose.com/ProductsServices/pan1.aspx を参考に。
引用返信 編集キー/
■19860 / inTopicNo.12)  Re[2]: 文字が全角か半角か判定する方法は?
□投稿者/ れい (585回)-(2008/05/31(Sat) 05:38:34)
No19827 (シャノン さん) に返信
> 対象の文字は System.Text.Encoding で扱える任意の文字、対象フォントは、FontDialog.FixedPitchOnly = true の場合に選択できる任意のフォントとし、「全角文字」とは、「半角文字」の2倍の幅を持つ文字とします。
> 「半角文字」の定義は何にしましょうか。コードポイント U+0041 の文字と同じ幅の文字、とか。

議論できるとするならば「MS ゴシック」とか「MS 明朝」での文字の幅とか、かな。
引用返信 編集キー/
■19866 / inTopicNo.13)  Re[3]: 文字が全角か半角か判定する方法は?
□投稿者/ ネタ好き (363回)-(2008/05/31(Sat) 10:05:42)
しまった!MeasureStringの存在を忘れていた。
これ使ったら文字列の幅もっと簡単に分かるような・・・
引用返信 編集キー/
■19914 / inTopicNo.14)  Re[1]: 文字が全角か半角か判定する方法は?
□投稿者/ シャノン (449回)-(2008/06/02(Mon) 10:36:43)
No19827 (シャノン さん) に返信

そもそもの目的は何かというと、バイナリエディタみたいなもの
(エディタまで行かずにビューワ止まりかもしれない)を作ってみようと思ったわけですよ。
で、よくあるじゃないですか、バイナリデータの隣に文字が表示されるやつが。
例えば、この文字表示のエンコードを UTF-8 としたとき、日本語のテキストを表示すると、
1文字3バイトになるわけですが、それをどうやって表現するかなぁ、と。

"あ" は 0xe3 0x81 0x82 ですよね。で、A, B, C... は 0x41, 0x42, 0x43... ですね。
一般に表示幅は 16 バイトずつですが、仮に一行 6 バイト表示だとして、「ああABCDEF」をダンプすると、

     | +0 +1 +2 +3 +4 +5 | 012345
0000 | e3 81 82 e3 81 82 | ああ
0006 | 41 42 43 44 45 46 | ABCDEF

だと格好がつかないわけで。
やはりここは、適当に詰め物を入れて、

     | +0 +1 +2 +3 +4 +5 | 012345
0000 | e3 81 82 e3 81 82 | あ.あ.
0006 | 41 42 43 44 45 46 | ABCDEF

とかになるのが妥当かなぁ、と。
で、このとき、フォントによっては "あ" の幅が "A" の2倍でないとかっこ悪いよね、と。

引用返信 編集キー/
■19915 / inTopicNo.15)  Re[2]: 文字が全角か半角か判定する方法は?
□投稿者/ シャノン (450回)-(2008/06/02(Mon) 10:39:33)
No19859 (れい さん) に返信
> 他の値を見てもわかるように、
> Monospacedというのは「なるべく同じ幅にみえるようそろえた書体」に過ぎません。
> とくにタイポグラフィックな人にとっては。
> 実際、活版な時代からMonospaceという書体・用語はありましたし、
> Panoseでは、「J」の幅÷「M」の幅が0.78以上の場合Monospacedであると定義されています。
> 全然「等幅」ではありません。

なんと…

> Monospacedなフォントで各文字の大きさが違うのは、「可能」ですし「普通」です。
> 全く捻くれていません。
> むしろ、全て同じ幅のフォントのほうがレアです。

「完璧に」とは言いませんが、概ね1:2に見えてくれればいいです。
ただ、1:2だったり1:3だったり2:3だったりというのが普通にあるようだと…と。

> (特に漢字圏の)情報処理な人からみると全て同じ幅だとか、2倍幅というのは特別な意味を持ちます。
> #そういった書体はタイポグラフィックな人はMonospacedではなくFixedPitchと言います。
> しかし、TrueTypeやOpenTypeではそれを明示したり指定したり保証する方法は在りません。
> 全ての文字について調べてみる他ありません。
> #正確にはそれでもだめです。カーニングとかがあるので。

個々の文字について実際に文字幅を調べて…というのはやりたくないですねぇ。
引用返信 編集キー/
■19917 / inTopicNo.16)  Re[2]: 文字が全角か半角か判定する方法は?
□投稿者/ れい (586回)-(2008/06/02(Mon) 10:56:08)
No19914 (シャノン さん) に返信
> ■No19827 (シャノン さん) に返信
>
> そもそもの目的は何かというと、バイナリエディタみたいなもの
> (エディタまで行かずにビューワ止まりかもしれない)を作ってみようと思ったわけですよ。
> で、よくあるじゃないですか、バイナリデータの隣に文字が表示されるやつが。
> 例えば、この文字表示のエンコードを UTF-8 としたとき、日本語のテキストを表示すると、
> 1文字3バイトになるわけですが、それをどうやって表現するかなぁ、と。

ならば「一文字ずつ」表示するのが妥当ではないでしょうか?
一文字ずつ位置を指定して表示すれば文字幅は関係ないですね。
すごく長い文字でない限り問題ないかと。

きちんと2倍の幅になってほしいなら、
2倍の幅が保証されている「MS ゴシック」とか「MS 明朝」を使うのがいいと思います。


> | +0 +1 +2 +3 +4 +5 | 012345
> 0000 | e3 81 82 e3 81 82 | ああ
> 0006 | 41 42 43 44 45 46 | ABCDEF
>
> だと格好がつかないわけで。
> やはりここは、適当に詰め物を入れて、
>
> | +0 +1 +2 +3 +4 +5 | 012345
> 0000 | e3 81 82 e3 81 82 | あ.あ.
> 0006 | 41 42 43 44 45 46 | ABCDEF
>
> とかになるのが妥当かなぁ、と。
> で、このとき、フォントによっては "あ" の幅が "A" の2倍でないとかっこ悪いよね、と。

Monospacedの話でもいったように、
「A」「B」「C」「0」「1」「2」ですら等幅でない場合が殆どですから
「012345」と「ABCDEF」を揃えることから考えないといけないわけです。

#殆どのMonospacedフォントで「1」は細いです。

ならやっぱり「一文字ずつ描画」ではないでしょうか?

私は「あ」などの3バイト文字は「|-あ-|」みたいに、
線を引いてその文字に相当する領域を示すことにしています。

文字幅が変わっても問題ないですし、
4バイト文字も5バイト文字も同様に処理できます。
引用返信 編集キー/
■19919 / inTopicNo.17)  Re[3]: 文字が全角か半角か判定する方法は?
□投稿者/ ネタ好き (365回)-(2008/06/02(Mon) 11:23:25)
シャノンさんへ返信
そりゃ難しいよ。やりがいあるけどね。
でも

0109
ああ

ならば問題ないけど、

0108
0あ

とか半角全角が混合した場合どうしたらいいものやら・・・
引用返信 編集キー/
■19935 / inTopicNo.18)  Re[3]: 文字が全角か半角か判定する方法は?
□投稿者/ シャノン (451回)-(2008/06/02(Mon) 18:39:50)
No19917 (れい さん) に返信
> ならば「一文字ずつ」表示するのが妥当ではないでしょうか?
> 一文字ずつ位置を指定して表示すれば文字幅は関係ないですね。
> すごく長い文字でない限り問題ないかと。

なるほど。
話はちょっと違いますが、ちゃんとしたワープロアプリでルーラを表示する場合なんかはどうやってるんでしょうね?

> きちんと2倍の幅になってほしいなら、
> 2倍の幅が保証されている「MS ゴシック」とか「MS 明朝」を使うのがいいと思います。

エンコードに任意のものを選べるとすると、日本語以外も考慮に入れたいじゃないですか。
なのでフォントは限定できないかなーと。
引用返信 編集キー/
■19936 / inTopicNo.19)  Re[4]: 文字が全角か半角か判定する方法は?
□投稿者/ シャノン (452回)-(2008/06/02(Mon) 18:44:31)
No19919 (ネタ好き さん) に返信
> とか半角全角が混合した場合どうしたらいいものやら・・・

どゆこと?
引用返信 編集キー/
■19938 / inTopicNo.20)  Re[4]: 文字が全角か半角か判定する方法は?
 
□投稿者/ れい (587回)-(2008/06/02(Mon) 18:55:04)
No19935 (シャノン さん) に返信
> 話はちょっと違いますが、ちゃんとしたワープロアプリでルーラを表示する場合なんかはどうやってるんでしょうね?

ルーラってルーラー?定規のことかしら?

#伸びてないと魔法に見える…

ちゃんとしたワープロアプリなら「文字数」じゃなくて「長さ」で定規を表示すると思います。
テキストエディタなら文字数というのも分かりますが。

ちなみに、秀丸もメモ帳も縦は揃わないようですね。

>>きちんと2倍の幅になってほしいなら、
>>2倍の幅が保証されている「MS ゴシック」とか「MS 明朝」を使うのがいいと思います。
>
> エンコードに任意のものを選べるとすると、日本語以外も考慮に入れたいじゃないですか。
> なのでフォントは限定できないかなーと。

「バイト数」と「文字の幅」は対応付けられませんし、
「文字数」と「文字列の幅」も対応付けられません。

日本語以外を考慮したいなら尚更。

それを無理に対応づけたいなら、自分で描画しなければいけない。
ただそれだけのことかと。
引用返信 編集キー/

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

管理者用

- Child Tree -