0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux のフォント問題を fontconfig のコマンドで切り分ける

0
Posted at

Linux で「フォントを入れたのに使われない」「fc-match が期待した結果にならない」という問題が起きたとき、最初から設定ファイルを書き換えたり、fc-cache -fv を繰り返したりすると原因を見失いやすくなります。

fontconfig の調査では、次の 5 つを分けて確認すると切り分けやすくなります。

順序 確認するもの コマンド
1 フォントが認識されているか fc-list
2 要求に対して何が選ばれるか fc-match
3 問い合わせがどう解釈されているか fc-pattern
4 どの設定ファイルが処理されているか fc-conflist
5 キャッシュを再構築する必要があるか fc-cache

設定変更より先に観測結果をそろえることが、この手順の要点です。

前提

対象は fontconfig を利用する GNU/Linux 環境です。fontconfig は、XML から内部設定を組み立てる設定処理と、問い合わせパターンから最も近いフォントを返すマッチング処理を分けて持っています[1]。このため、設定ファイルの有無と、最終的なフォント選択は分けて確認します。

ディストリビューションや導入されているパッケージによって設定内容は異なるため、最初に実環境のバージョンを記録しておきます。

$ fc-list -V

fc-list-V はバージョンを表示して終了するオプションです[2]

本稿では、執筆時点で Debian testing に掲載されている fontconfig 2.17.1-5 のマニュアルページを確認しています。fonts-conf(5) 自体のバージョン表記は fontconfig 2.17.1 です[1]。以下の手順では特定のディストリビューション固有設定を前提にせず、各コマンドの実出力を基準に判断します。

最初に確認する順序

フォントの問題は、少なくとも「存在」「選択」「問い合わせ」「設定」「キャッシュ」に分けて確認できます。

たとえば fc-match が期待したフォントを返さない場合でも、原因がフォント未認識とは限りません。fc-list には出ているが優先順位の結果として別のフォントが選ばれている場合と、そもそも fontconfig からフォントが見えていない場合では、調べる場所が異なります。

同様に、設定ファイルを追加した直後に結果が変わらなくても、ただちにキャッシュを原因とは判断しません。まず、その設定が実際に処理されているかを確認します。

以降は、この順序で状態を絞り込みます。

fc-list でフォントが認識されているか確認する

最初に、目的のフォントが fontconfig から見えているかを調べます。fc-list は、fontconfig を利用するアプリケーションから利用可能なフォントとスタイルを列挙するコマンドです[2]

日本語を扱えるフォントのファミリーを確認する場合は、次のように実行します。

$ fc-list :lang=ja family

出力が多い場合は、目的のファミリー名が含まれているかを確認します。ここで目的のフォントが見つからなければ、fc-match の優先順位を調べる前に、フォントの配置や探索対象、キャッシュを疑うべき状態です。

逆に、目的のフォントが一覧に出ているなら、少なくとも fontconfig はそのフォントを認識しています。この時点で「フォントがインストールされていない」という仮説はいったん外し、次のマッチング確認へ進めます。

fc-list にはパターンを指定でき、指定した条件に一致するフォントだけを表示できます。マニュアルページにも fc-list :lang=hi の例があり、言語条件で対象を絞れることが確認できます[2]

fc-match で実際のマッチ結果を確認する

フォントが認識されていることが分かったら、要求に対して何が選ばれるかを調べます。

$ fc-match sans
DejaVuSans.ttf: "DejaVu Sans" "Book"

$ fc-match serif
DejaVuSerif.ttf: "DejaVu Serif" "Book"

$ fc-match monospace
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"

出力例は環境によって異なります。

fc-match は、与えられたパターンに通常の fontconfig のマッチング規則を適用し、利用可能なフォントから最適な候補を返します[3]sansserifmonospace は、特定のフォントファイル名を直接指定するものではなく、汎用ファミリーとして問い合わせるときに使われます。

ここでは、期待するファミリーが返るかを確認します。目的のフォントが fc-list には存在するのに fc-match では別のフォントが返るなら、インストールの問題ではなく、マッチング条件や優先順位を調べる段階です。

言語条件を付けた結果と比較する

日本語環境では、言語条件なしと lang=ja 付きの結果を比較すると原因を絞りやすくなります。

$ fc-match sans
$ fc-match "sans:lang=ja"

fc-match のマニュアルページでも、sanssans:lang=en のように言語条件を付けた問い合わせが例示されています[3]

2 つの結果が異なる場合は、単純な sans の優先順位だけではなく、日本語を扱う条件を含めて候補が変化していることが分かります。

最初の 1 件だけでは判断しづらい場合は、候補を並べて確認します。

$ fc-match -s "sans:lang=ja"

-s は、マッチするフォントを並べ替えた一覧として表示するオプションです[3]。期待するフォントが先頭ではなく途中に現れる場合、fontconfig から見えてはいるものの、現在の条件では別候補の方が優先されています。

fc-pattern で問い合わせパターンを確認する

fc-match で選択結果が分かったら、その結果だけを見るのではなく、問い合わせ自体がどう解釈されているかを追います。

$ fc-pattern sans

fc-pattern はパターンを解析し、その内容を表示するコマンドです[4]

設定による置換 まで確認する場合は、次のように実行します。

$ fc-pattern -c -d sans

-c は設定による置換、-d は既定値による置換を適用してからパターンを表示します[4]

調査対象は次の関係です。

入力したパターン
        ↓
設定による置換
        ↓
マッチングへ渡される条件
        ↓
fc-match の結果

fc-match の返り値だけを見ると、「なぜそのフォントが選ばれたのか」が見えません。fc-pattern を挟むことで、問い合わせ条件が設定によってどのように補われているかを確認できます。

fc-conflist で読み込まれた設定を確認する

マッチングの結果が期待と違い、設定ファイルを疑う段階になったら、fontconfig が実際に処理した設定を洗い出します。

$ fc-conflist

fc-conflist は、fontconfig が処理した設定ファイルを注釈付きで一覧表示します。出力の + は処理されたファイル、- は無視されたファイルを表します[5]

標準的な設定ファイルの候補として、fonts-conf(5) には /etc/fonts/fonts.conf/etc/fonts/conf.d、利用者ごとの $XDG_CONFIG_HOME/fontconfig/fonts.conf などが挙げられています[1]。システム設定から local.conf を追加で読み込む構成例も示されています[1]

/etc/fonts/fonts.conf
/etc/fonts/conf.d/
$XDG_CONFIG_HOME/fontconfig/fonts.conf

ただし、ファイルが存在することと、その設定が現在の処理で有効になっていることは同じではありません。ディストリビューションやフォントパッケージによって追加される設定もあるため、ファイル名を決め打ちするより fc-conflist の結果を確認した方が確実です。

たとえば /etc/fonts/local.conf を編集したのに fc-match の結果が変わらない場合、最初に確認するのは次の 2 点です。

  1. fc-conflist に対象ファイルが処理済みとして現れるか
  2. fc-patternfc-match の結果に設定変更が反映されているか

この 2 点を確認せずにキャッシュだけを再構築しても、設定ファイルそのものが処理されていなければ問題は解消しません。

必要な場合だけ fc-cache を再構築する

フォントを追加・変更した、または fc-list に目的のフォントが現れずキャッシュを疑う根拠がある場合は、キャッシュを再構築します。

$ fc-cache -fv

fc-cache はフォントディレクトリを走査し、fontconfig が利用するフォント情報のキャッシュを生成します。-f は既存キャッシュが最新と判断される場合でも再生成し、-v は処理状況を表示します[6]

実行後は、再び観測コマンドへ戻ります。

$ fc-list :lang=ja family
$ fc-match "sans:lang=ja"

再構築の前後で結果に差が出たかを比較します。

一方、fc-list には目的のフォントが出ており、fc-conflist でも設定が処理されているのに、fc-match の優先順位だけが期待と異なる場合、fc-cache -fv は優先順位そのものを変更しません。キャッシュ生成とマッチング規則の調整は別の処理だからです[6]

切り分け結果から原因を判断する

ここまでの結果は、次のように整理できます。

fc-list fc-match fc-conflist 次に調べる対象
目的のフォントが出ない 未確認 未確認 フォントの配置、探索対象、キャッシュ
目的のフォントが出る 期待と違う 想定設定が処理されている パターン、言語条件、alias や優先順位
目的のフォントが出る 期待と違う 想定設定が処理されていない 設定ファイルの配置や読み込み経路
目的のフォントが出る 期待どおり 想定設定が処理されている fontconfig より後段、アプリケーション固有設定

この表で重要なのは、症状から修正方法を直接決めないことです。

たとえば「フォントが使われない」という同じ見え方でも、fc-list に出ないなら認識側、fc-list に出て fc-match が違うなら選択側、fc-match まで期待どおりなら fontconfig の外側へ調査対象を移せます。

設定を書き換えるのは、どの段階で期待と実測が分岐したかを確認してからです。

fc-match の結果と実際の表示は同じとは限らない

fc-match が期待したフォントを返しても、画面上のすべての文字が必ずその 1 つのフォントファミリーだけで描画されるとは限りません。一般的な GUI の文字表示では、fontconfig による候補選択の後にも文字整形やフォールバックなどの処理があり、一部の文字だけ別フォントになる場合があります[7]

そのため、次の状態まで確認できた場合は、fontconfig の調査をいったん区切れます。

$ fc-list :lang=ja family
# 目的のフォントが存在する

$ fc-match "sans:lang=ja"
# 期待するフォントが返る

それでも特定のアプリケーションだけ表示が異なるなら、次に調べるのはアプリケーション固有のフォント設定や、fontconfig より後段の文字処理です。

逆に fc-match が期待と違う段階で、描画品質やアプリケーション固有設定まで同時に変更すると、原因を分離できなくなります。

まとめ

Linux の fontconfig 周辺でフォント問題を調べるときは、設定変更より先に次の順序で状態を確認します。

fc-list
   ↓
fc-match
   ↓
fc-pattern
   ↓
fc-conflist
   ↓
必要な場合だけ fc-cache

fc-list で認識状態を確認し、fc-match で選択結果を見ます。選択理由を追う必要があれば fc-pattern で問い合わせを確認し、設定を疑う段階で fc-conflist を使います。fc-cache は、フォント追加やキャッシュ不整合を疑う根拠がある場合に実行します。

この順序にすると、「フォントが存在しない」「存在するが選ばれない」「設定が処理されていない」「fontconfig までは期待どおり」という状態を別々に扱えます。修正対象を観測結果から決められるため、local.conf やキャッシュを試行錯誤で変更する必要がなくなります。

参考文献

  1. Fontconfig, fonts-conf(5)(2026-02-09). https://manpages.debian.org/testing/fontconfig-config/fonts-conf.5.en.html
  2. Keith Packard, Josselin Mouette, fc-list(1)(2008-08-13). https://manpages.debian.org/testing/fontconfig/fc-list.1.en.html
  3. Patrick Lam, fc-match(1)(2008-08-13). https://manpages.debian.org/testing/fontconfig/fc-match.1.en.html
  4. Behdad Esfahbod, fc-pattern(1)(2010-04-20). https://manpages.debian.org/testing/fontconfig/fc-pattern.1.en.html
  5. Akira TAGOH, fc-conflist(1)(2021-12-21). https://manpages.debian.org/testing/fontconfig/fc-conflist.1.en.html
  6. Keith Packard, Josselin Mouette, fc-cache(1)(2008-08-13). https://manpages.debian.org/testing/fontconfig/fc-cache.1.en.html
  7. id774, Linux のフォントはどのように表示されるのか(2026-03-15). https://blog.id774.net/entry/2026/03/15/4010/
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?