ジャンル不定の日記です。

LinuxのJavaフォント

Linux環境再構築すると、毎度のようにJavaのフォント設定で苦労するんだが、理解できた気がする。
環境はArch Linux。


まず最重要なのが、バージョン別のJavaを初起動すると、
~/.java/fonts/バージョン/xxxxxxxxx.properties
ってなファイルが自動で作成される。
このファイルは利用可能なフォントの一覧と優先順位を設定するものと思う。
これがJavaのバージョンが変わらない限り自動で更新されないと思われるので、フォントをインストールしたらファイルを消して再作成させないと新しいフォントが有効にならないぽい。

上記ファイルで利用可能なフォントが確認できるが、
Linuxで使えるフォントであっても使えないフォントがある模様。(認識させれば使えるのかもしれないが)
手元の環境では、Adobe Source Han Sans JPがインストールされていて主に使っているのだが、上記ファイル内で確認できない。

フォントの優先順位はfontconfigに従うので、ユーザー別の設定なら ~/.config/fontconfig/fonts.conf に書けばいい。

ネイティブなアプリだと、規定フォントで表示できない文字が出現したらその他の優先順位の高いフォントが利用されると思うが、
Javaアプリの場合は規定フォントで表示できない文字は優先順位無視でfallbackフォントが利用される気配。
ttf-arphic-uming
がインストールされていると殆どの文字が表示できるようになるが、表示できない文字に ttf-arphic-umingが使われるためだと思う。
ちなみに、このフォントは汚い。

仕様は多分そんな感じだと思う。


まとめると、
  1. フォントを新しくインストールしたりfontconfigの優先順位を変えた場合は ~/.java/fonts を消す必要がある。
  2. Javaアプリを起動すると ~/.java/fonts に設定ファイルが作られ、利用可能なフォントが確認できる。
  3. fontconfigの優先順位の設定は、利用可能フォント中で目的のフォントが最上位でないといけない。
3.で設定に制限されてしまうが、
日本語フォントよりもラテンフォントの優先順位が高かったりすると、ラテンフォントで表示できない文字に日本語フォントが使われずにfallbackフォントが使われて、fallbackフォントでも表示できない場合は豆腐になっちゃう感じぽい。


うちのsans-serifの設定が、
<alias>
    <family>sans-serif</family>
    <prefer>
        <family>Source Han Sans JP</family>
        <family>Noto Sans CJK JP</family>
        <family>IPAPGothic</family>

        <family>Source Han Sans</family>
        <family>Source Sans Pro</family>
        <family>Noto Sans</family>
    </prefer>
</alias>
こんな感じでJPフォント、CJKフォント、ラテンフォント、の順の設定になってる。
Source Han SansかNoto Sans CJKが使えればいいんだが、それらのJPフォントはJavaで利用できないか認識できない模様で、この設定だとIPAフォントが使われるぽい。

CJK以外のNoto Sans、Source Sansフォントは利用可能のようなので、Noto Sansの優先順位がIPAよりも高いとNoto Sansが使われるぽい。
その場合はNoto Sans CJKフォントが使えないため、表示できない文字がfallbackフォント( ttf-arphic-uming)で表示される。



あと、いつも使ってる Java Web Start のアプリが、Oracleの公式Javaだと実行できるのにIcedtea-webだとエラーで実行できないんだが、
目的のjnlpファイルの先頭にBOMが入ってるとXMLパースエラーになって実行できない模様。
エラーになるjnlpファイルをダウンロードして、BOM(先頭3byteの[0xEF 0xBB 0xBF])を消して、<jnlp>のhref属性を消す。
そうすると、ダウンロードして編集したjnlpファイルからなら起動できる。
まあ、そんなことするよりもOracleのJava入れちゃった方が良いと思う。OpenJDKとの共存も簡単だし。
XMLの仕様的にはBOMが入ってても問題ないと思うんで、Icedtea-webが悪いね。