(この記事はブログをはじめる前に書いた記事を書き写したものです)
前書き
(この記事内容には少々自信が持てない内容があります。間違い等ありましたら指摘していただけると幸いです。)
Windowsアプリケーションを作成する際、開発者はダイアログボックスで使用するフォント(以下ダイアログフォント)を指定する事ができます。とはいえ、変にフォントを変更すると互換性の問題が出てくるので標準のフォントを使用するのが常です。例えばそれは日本語版Visual C++ 6.0では”MS P ゴシック”であり、英語版のそれは”MS Sans Serif”であります。
ところで英語のオンラインソフトには日本語が入力、表示できないアプリケーションが多くあります。これはこのダイアログフォントが英語版Visual C++ 6(Delphiも?)で前述の”MS Sans Serif”になっている事が原因で、このフォントには日本語文字が含まれていないからです。
FontSubstitute
さて、苦労してデザインした一つのダイアログボックスを多国語に対応させたいとします。するとこのフォント指定が非常に困った事になってくるわけです。”MS Sans Serif”にすれば英語環境で動く一方日本語はダメになり、”MS P ゴシック”にすれば日本語で動く一方英語環境にはこんなフォントは存在しません(まあ存在しないフォントが指定された場合標準フォントが使用されるのでその意味で問題は無いのですが)。この事をふまえ、MicrosoftはWindows 2000以降にFontSubstituteという機能を導入しました。これは簡単に言うと、存在しないフォントが要求された時にそれがFontSubstitute機能に登録されたフォントであれば登録された情報を元に別のフォントを代わりに返す機能です。具体的に言うと、日本語版Windows 2000ではHelveticaを指定された時にArialを返すような設定などがされています(そりゃ一般人はHelveticaなんて持ってない)。存在しないフォントのマッピングを行うわけですね。
ではこの機能を使って”MS Sans Serif”を”MS P ゴシック”や”MS UI ゴシック”にマッピングすれば英語ソフトも使えるようになる・・・そう思うのが自然です。
日本人
しかしそれでは上手くいきません。何故なら日本語環境にも何故か”MS Sans Serif”が英語フォントとして存在しているからです。つまりMS Sans Serifを違うフォントにマッピングしようとしても、MS Sans Serifが存在しているのでそのまま使用されてしまうのです。
2004年10月24日現在、私はPSPadという海外製エディタの日本語化をまったりと行っているのですが、どうも中国語環境でダイアログボックスに中国語を表示、入力できているようなのです(フォーラムで苦情や要望が出ていない)。これは中国語だけではなく、他の言語環境についても言えます。
改めて考えてみると不自然な点がいくつかあります。まず前述の通りPSPadが中国語を含む20もの言語環境で使用されているにも関わらず、ダイアログフォントに関する苦情が出ていない事。MS Sans Serifという英語フォントが日本語環境にも存在している事。何故か日本人は「Sans Serif」という文字体を「ゴシック」と呼ぶ事。
・・・要するに、日本語版Windowsを作るにあたって日本語フォントを作る必要が出た時、「日本人にはSans SerifやSerifといった字体の表現は慣れていないから慣れているゴシックと明朝にしよう」とした事がそもそもの間違いだったのでしょう(市場戦略的にはごく当然の決断だと思いますが)。他の言語では、恐らくその言語特有の文字をMS Sans Serifに「追加」したと推測できます。一方日本では日本語語特有の文字をMS Sans Serifに追加、それを新しく「MS ゴシック」としたのでしょう。また、別のフォントにしたのでMS Sans Serifは日本語環境で不要になるのですが、英語アプリケーションとの互換性の為に恐らく「そのまま」残したと考えられます。
以上から、ダイアログフォントをMS Sans Serifに指定されて困るのはどうも日本語環境だけだと推測できます。
MS Shell Dlg
そこで、MicrosoftはFontSubstituteと一緒に”MS Shell Dlg”が登場させました。実を言うとこのような名前のフォントは存在しません。FontSubstituteを利用して、MS Shell Dlgを指定された時は各言語の標準ダイアログフォントにマッピングするようにしたのです。ちなみにコントロールパネルで言語設定を変更した時はこの値も同時に変更されます。つまり、このフォント指定を使用すればどのような言語環境でも文字化けしないダイアログを作れる事になります。
Visual Studio .NET 2003 Academicで試したところ、日本語以外(なんでまた日本語だけ・・・(怒))の言語環境で開発するとダイアログフォントは皆MS Shell Dlgになっています。恐らく最近の海外アプリケーションで日本語表示が上手くいく理由はこれなのでしょう。ありがたい話ではあります。
本当の最後にうんちく
なお、元来ゴシックとは古めかしい、といった意味なのでSans Serifより明らかにSerif体に近いニュアンスがあります。従ってそのあたりの、日本語英語的な解釈違いに対するサポートの手間を考えてそのような決断をしたのだと思います何故昔の日本人がそのような解釈違いをしてしまったのかは知りませんが、この何百年前(?)の間違いが現代のダイアログフォント問題につながっているのです。
また、FontSubstitute機能は無駄なのかというと、そうでもありません。例えばGaramondを指定された時はサンセリフ体のMS UI Gothicで表示されてしまうよりもGeorgeaで表示した方が幾分好ましいでしょう。レジストリエディタを使う以外に登録方法を知りませんが、もう少し手軽に使えれば悪くない機能だとは思います。