2012-03-30

GNU/Linuxでfontconfigにより日本語フォントを優先させる方法

GNU/Linuxでは、fontconfigによりフォントの優先順位を設定している。この設定によって、フォントに存在しないグリフでも補完して表示できる。この機能は、モダンなOSなら大抵備えている機能である。しかし、もし、日本語と文字を共有している他言語のフォント、例えば簡体字や繁体字のフォントの優先順位が、日本語フォントより高い場合、そのフォントが日本語フォントより優先されてしまう。

どうも、この問題に対して、場当たり的に対処している人間が多いようだ。たとえば、該当の日本語以外のフォントを削除するという選択だ。PulseAudioの件と同じ場当たり的な対応である。なぜ問題の本質を探ろうとしないのか。そもそも、多言語環境を本当に実現したければ、重複数複数のフォントがあっても問題ないようにすべきである。問題を本当に解決するためには、フォントの優先順位の変更が必要だ。

日本人ならば、日本語フォントを優先したいだろう。そこで、GNU/Linux環境が日本語フォントを優先する設定になっていない場合、以下の手順で日本語を優先的に使用できる。

まず、できるだけシステム全体には影響を及ぼしたくないので、ユーザーごとの設定を行う。まず、設定ファイルをユーザーのホームディレクトリにコピーする

cp /etc/fonts/conf.avail/69-language-selector-ja-jp.conf ~/.fonts.conf

次にsedかawkを・・・といきたいところだが、この先の内容は環境によって異なると思われるので、残念ながらここに汎用的で自動的な方法を書くことはできない。まあ、そもそもfontconfigのディレクトリも環境により異なるかもしれないし、69-language-selector-ja-jp.confというファイル名だって、一致しているとも思えないが、それはさておき、とりあえず使い慣れたテキストエディタで開く

vim ~/.fonts.conf

ここから先は、環境によって異なるので、なんとも言えないのだが、Ubuntu 11.10の場合で説明する。以下の三行が何箇所かにあるので、すべて削除する。

<test name="lang" compare="contains">
    <string>ja</string>
</test>

このコードが、ロケールが日本語の場合のみ日本語フォントを適用するようにしている問題の本質だ。これを消せば、常に日本語フォントが適用される。この~/.fonts.confは、/etc/fonts/conf.avail/50-user.confから参照されている設定ファイルで、69-language-selector-ja-jp.confより優先される。

更にこの際に、日本語フォントの設定をお好みに合わせて変えておこう。ユーザーごとのホームディレクトリで行うので、どんな編集をしても安全である。もし失敗した場合は、~/.fonts.confを消して、最初からやり直せばよい。/etcにあるファイルは、今後のアップデートで書き換えられるかもしれないファイルである。書き換えるのはやめておこう。

じつは、これも問題の根本的解決ではない。根本的解決には、やはりシステム側でフォントの設定ツールを提供すべきではないのか。私は日本人なので日本語フォントが優先されることを好むが、中国人や台湾人は、簡体字や繁体字フォントを優先させたいはずだ。

と思ってみてみたら、zh-cnとかzh-hkとかzh-twには、上の三行のような条件指定がない。やはり不具合かもしれぬ。

追記:Ubuntu 12.10からは、.fonts.confの置き場所としてホームディレクトリ直下はdeprecatedになり、~/.config/fontconfig/下に置くべきだそうだ。

~/.fonts.conf は deprecated らしい - どせいけいさんき。

No comments:

Post a Comment

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.