■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 を参考に。
|
|