フォントの設定
d:id:torutk:20080109でJavaのフォント設定について言及しましたが、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 明朝」が設定されるためと思われます。