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

わんくま同盟

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

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


(過去ログ 38 を表示中)
■19859 / )  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 を参考に。
返信 編集キー/


管理者用

- Child Tree -