2008-09-11

Google Chromeのフォーム内の日本語フォントのおかしい理由が分かった

Google Chromeを使っていて、文字列を入力するフォーム内の日本語がおかしいと、常々思っていた。フォーム内の日本語は、とても異質に感じられるのだ。だいたい、句読点などの描画位置もおかしい。

私は最初、フォントのサイズが小さいためだと思っていたが、どうもそうではないらしい。第一、Google Chrome以外は、例えどんなにフォントが小さくても、それなりの描画をするからだ。Google Chromeの文字列の描画が独自のものか、Windowsに頼っているのかは知らないが、とにかく句読点の描画位置がおかしいなどと言うことはない。

実は、フォーム内の漢字は、日本語ではなかったのだ。そう、繁体字、あるいは、Traditional Chineseと呼ばれる文字だったのだ。

しかし、何故日本語の漢字が、繁体字として描画されているのか。色々と試した結果、実にあほらしいことが判明した。

Google Chrome自体の言語(ブラウザのメニューやダイアログなどの言語)を、English(United States)にしていると、Chromeはフォーム内の漢字を繁体字として描画する。
日本語に設定してあると、日本語の漢字として描画する。
Webサイトに送る"ja-jp"などの文字列ではなく、ブラウザの表示言語が、フォントの描画に影響するとは。

ブラウザ自体の言語の設定が、フォントのレンダリングに影響を与えるとは驚きだ。私のUnicodeに関する理解は薄いが、乏しい知識から考えてみれば、Unicodeでは、漢字と言うのは基本的に、CJK Unified Ideographs(CJK統合漢字)であって、中国と日本の同じ漢字は、例え多少字体が違おうとも、同じコードに割り当てている。すると、繁体字と日本語のどちらで描画するかは、Unicodeの上では区別できないということになる。つまり、日本語フォントを明示的に指定していないフォーム内のCJK統合漢字の描画は、ブラウザがどのフォントを漢字用に使うかにかかっている。Windowsネイティブでは、フォントリンクと呼ばれているこの機能、Google Chromeはブラウザ自体の設定言語が合衆国英語の場合、中国語フォントを選ぶのだ。

しかしどうすればいいのだろう。ブラウザ自体の言語には日本語を使うしかないのか。

追記:ちょっとしたテストをしてみる。

これは日本語フォントを使っているので、日本語で描画されます。Unicodeでは、漢字はCJK統合漢字として、同じ漢字は、中国、日本、台湾と、微妙な差異があったとしても、同じ符号を割り当てます。

これは中国語フォントを使っているので、中国語で描画されます。Unicodeでは、漢字はCJK統合漢字として、同じ漢字は、中国、日本、台湾と、微妙な差異があったとしても、同じ符号を割り当てます。

3 comments:

  1. ああ、そういう仕組みだったのですね。摩訶不思議。

    自分の場合、OpenTypeフォントをPreferenceで強制的に割り当てているせいなのか、フォーム内のフォントも日本語になっています(もちろんメニューは英語です。)

    一方、hitoさんのテスト項目では両方ともOpenTypeフォントでは描画されず、上は日本語fixedフォント、下は中国語fixedフォントになっています。

    ReplyDelete
  2. どちらもプロポーショナルフォントなんですけどね。
    しかし、ChromeのUnicodeの対応は完璧ではありませんねぇ。
    http://blogs.msdn.com/michkap/archive/2005/09/22/473049.aspx
    Vista上のIE7ではなぜかまったく表示できない不思議なページ。
    FirefoxとOperaでは問題なし。
    Chromeでは一部描画できない。

    ReplyDelete
  3. 今もアサインされたままとまってるんですね。。
    http://code.google.com/p/chromium/issues/detail?id=7160

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.