「MS のフォントはどこが汚いのか」では見た目を取り上げましたたが, 今回はもうちょっと内部的な問題点について書きます。
標準のダイアログなどでは, プログラム側でとくに指定しないと「System」フォントが使われます。 このフォントは大きさが(解像度に応じて)固定された一種類しかなく, 融通がきかないのですが, 特に日本で問題になるのは「サイズによって縦横比が違う」ことです。 (ここでいう縦横比とは, TEXTMETRIC の tmHeight と tmAveCharWidth のことです) 英語版 Windows では, どれも基本的に縦横比が 2:1 になるように設計されているのですが, 日本語版の System/FixedSys フォントは縦長になっています。 そうした理由は「その方が美しいから」だったように覚えています。
それだけでなく, なんとサイズごとに縦横比が違うのです。 「普通のフォント」では 18:8, 「小さなフォント」では 12:5 となっています。
システムフォントの縦横比がなぜ問題になるかというと, ダイアログのサイズがそれによって決定されるからです。 アプリケーション側で何もフォントを指定しないとシステムフォントを使うことになりますが, 外国製のアプリケーションは縦横比 2:1 になることを前提としてデザインしてあるので, 日本語Windowsで動かすと妙に縦長になってしまいます。
それだけでなら美観の問題ですむのですが, 昔はディスプレイ解像度が低かった(640x480 または 640x400)ので, 下の方にあるボタンが画面の外にはみ出してマウスでクリックできないこともしばしばでした。 (雑誌ではこの現象を根拠にして 「NECのマシンは解像度が低いからいかん」とか 「Windows を動かすには大きなモニタが必要」とか, 自分勝手な論理を展開していましたが, もちろんそうではなく, 英語版Windowsで動かせば低い解像度でもちゃんと画面に収まっていたのです。)
今は高解像度のマシンが普及しているので大丈夫かというとそうではなく, Microsoft の Tweak UI を日本語Windows95で動かすと ボタンがプロパティシートの外にはみだすという現象がおきています。
おそらく, 最初にシステムフォントをデザインしたころは, 日本語Windows上で外国製アプリケーションを動かす可能性を あまり考えていなかったのだろうと思います。
また, システムフォントの大きさの違いによって縦横比が異なるために, 日本製アプリケーションだけを使っていても, アプリケーションを設計した人と使う人が 異なる大きさのシステムフォントを使っていると ラベルの文字が一部消えたりする現象も発生します。 この問題に対しては適当な解決策がありません。 せいぜい,
くらいでしょうか。
なお, 「MS ゴシック」などの TrueType フォントは縦横比が 2:1 になるように設計されています (縦が奇数の場合は端数を切り捨てるので少し横が狭くなる)。
Windows のフォントには, 文字の幅が固定のものと文字によって変化するものがあります。 後者の方が見た目はいい(ただし日本語の場合必ずしもそうとは言えない場合もある)のですが, タイプライタ風の表示をしたい場合は固定幅フォントを使いますし, プログラム側の処理上固定幅のフォントしか使えない場合もあります。 たとえばプログラムエディタでは「次の行に移る」処理をするのに, 固定幅フォントを使っていれば, 現在カレットが n桁めにある場合, 次の行の n桁めに移せばいいわけですから楽です。 これを可変幅にすると,
という手順を踏むことになり, エディタの軽さを損なうおそれがあります。
文字集合が ANSI の場合, 固定幅フォントは文字どおり 1種類の幅しかありません。 マルチバイト文字集合の場合, 2バイト文字が 1バイト文字の倍の幅になります。
ところが, MS の日本語フォントの場合はそうでない場合があります。 前項で述べたとおり, 縦横比を保つために 1バイト文字の幅 = 高さ÷2 として計算しますが, このとき小数点以下は切り捨てます。 ところが 2バイト文字では幅 = 高さなので, 高さが奇数の場合に 1バイト文字の幅が 2バイト文字の幅の半分よりも小さくなってしまうのです。 これでは先に述べたように文字のバイト数から簡単に文字位置を計算することができなくなってしまいます。 プログラマにとっては悩みの種です。 いったい何のための固定幅フォントなのでしょうか...
他の, GB や Big5 のフォントではこのような困った現象はおきません。
(工事中)