torutkのブログ

ソフトウェア・エンジニアのブログ

フォントの設定

d:id:torutk:20080109Javaのフォント設定について言及しましたが、Windows Vista/JDK1.6.0u13において、MeiryoKe Gothicを指定しようとしてはまりました。

fontconfig.propertiesで指定するフォント名にアンダースコアは含めることができない

フォント名を指定する際、空白文字が含まれるフォント名(例:"MS Gothic")は、フォントファイル名を指定する際、プロパティのキー文字列中では空白文字をアンダースコアで代替表記する仕様になっています。

monospaced.plain.japanese=MS Gothic
    :
filename.MS_Gothic=MSGOTHIC.TTC

ここで、以下のようにフォントにMeiryoKe_Gothicを指定しようとしても、設定が有効になりません。

monospaced.plain.japanese=MeiryoKe_Gothic
    :
filename.MeiryoKe_Gothic=meiryoKeGothic.ttc

この設定では、Windows上ではなぜかmonospacedで指定したフォントが明朝体MS 明朝)で表示されるようになってしまいました。

Java側での回避方法が見つからなかったので、MeiryoKeフォントのフォント名を変えて問題を回避します。フォント名を変更するには、以下URLから入手できるttfname3を使いました。
http://web1.nazca.co.jp/hp/nzkchicagob/m5r4157/mretc6gb.html

アンダースコアが使えない

JDK 1.6.0 Update14 b05のソースを展開して、fontconfig.propertiesを読んでいる場所を見当つけて調べてみると、j2se/src/share/classes/sun/awt/FontConfiguration.javaの中に以下の記述を見つけました。

  private void parseProperty(String key, String value) {
    if (key.startsWith("filename.")) {
      //the only special case is "MingLiu_HKSCS" which has "_" in its
      //facename, we dont want to replace the "_" with " "
      key = key.substring(9);
        if (!"MingLiU_HKSCS".equals(key)) {
            key = key.replace('_', ' ');
        }

filename.に続くフォント名に、アンダースコアがあると、MingLiU_HKSCSを除きアンダースコアがスペースに変換されてしまいます。したがって、フォント名にアンダースコアが含まれていると、JDKのfontconfig.propertiesで指定することができないという問題が発生します。

fontconfigでフォント指定が失敗したときに、明朝が表示されるわけ

次に、フォントの指定が失敗した場合に明朝となる仕組みは、JDK 1.6.0 Update14 b05のソースのj2se/src/windows/classes/sun/awt/windows/WFontConfiguration.javaの中に、

  protected void initReorderMap() {
    if (encoding.equalsIgnoreCase("windows-31j")) {
      localeMap = new Hashtable();
          :
        localeMap.put("dialoginput.plain.japanese", "MS Mincho");
        localeMap.put("dialoginput.bold.japanese", "MS Mincho");
	localeMap.put("dialoginput.italic.japanese", "MS Mincho");
	localeMap.put("dialoginput.bolditalic.japanese", "MS Mincho");

とあり、初期化時に、dialoginputのフォントに「MS 明朝」が設定されるためと思われます。