Fontconfig (4日目) - ざっくりしたFontconfigの動作

繰り返しになりますがFontconfigは注文されたフォントパターンに対して実際のフォントを返すライブラリです。 フォントパターンの書き方は押さえましたので、実際に動作させてみましょう。

細かい話は次回以降にして今日は動作の概略を掴みたいと思います。

動作結果

Fontconfigの実際の動作結果は fc-match で確認できます。

$ fc-match 'DejaVu Sans'
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match 'sans\-serif'
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
$ fc-match 'serif'
NotoSerifCJK-Regular.ttc: "Noto Serif CJK JP" "Regular"
$ fc-match 'monospace'
NotoSansCJK-Regular.ttc: "Noto Sans Mono CJK JP" "Regular"
$ fc-match 'DejaVu Sans,Noto Sans,sans\-serif'
DejaVuSans.ttf: "DejaVu Sans" "Book"

ただ、Notoフォントファミリーが複数のフォントから構成されていますように、ひとつのフォントで全ての文字がカバーされることはまずありません。 フォールバックフォントも確認しないとですね。

フォントパターンの2番目以降や設定ファイルにあるフォールバックフォントも含めて結果を得るには fc-match-s オプションを渡します。

$ fc-match -s 'DejaVu Sans' | head
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
NotoSans-Regular.ttf: "Noto Sans" "Regular"
NotoSansArabic-Regular.ttf: "Noto Sans Arabic" "Regular"
NotoSansThai-Regular.ttf: "Noto Sans Thai" "Regular"
NotoSansDevanagari-Regular.ttf: "Noto Sans Devanagari" "Regular"
NotoSansTamil-Regular.ttf: "Noto Sans Tamil" "Regular"
NotoSansHebrew-Regular.ttf: "Noto Sans Hebrew" "Regular"
NotoSansBengali-Regular.ttf: "Noto Sans Bengali" "Regular"
$ fc-match -s 'DejaVu Sans' | wc -l
150
$ fc-match -s 'DejaVu Sans,Noto Sans,sans\-serif' | head
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
NotoSans-Regular.ttf: "Noto Sans" "Regular"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
NotoSansArabic-Regular.ttf: "Noto Sans Arabic" "Regular"
NotoSansThai-Regular.ttf: "Noto Sans Thai" "Regular"
NotoSansDevanagari-Regular.ttf: "Noto Sans Devanagari" "Regular"
NotoSansTamil-Regular.ttf: "Noto Sans Tamil" "Regular"
NotoSansHebrew-Regular.ttf: "Noto Sans Hebrew" "Regular"
NotoSansBengali-Regular.ttf: "Noto Sans Bengali" "Regular"
$ fc-match -s 'DejaVu Sans,Noto Sans,sans\-serif' | wc -l
150

特にどこにも指定されていなくてもとにかく使えるフォントを総動員してフォールバックしろ、という場合の結果を得るには fc-match-a オプションを渡します。

$ fc-match -a 'DejaVu Sans' | head
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
NotoSansCJK-Bold.ttc: "Noto Sans CJK JP" "Bold"
NotoSans-Regular.ttf: "Noto Sans" "Regular"
NotoSans-Bold.ttf: "Noto Sans" "Bold"
NotoSans-Italic.ttf: "Noto Sans" "Italic"
NotoSans-BoldItalic.ttf: "Noto Sans" "Bold Italic"
NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"
NotoSansCJK-Bold.ttc: "Noto Sans CJK SC" "Bold"
$ fc-match -a 'DejaVu Sans' | wc -l
471
$ fc-match -a 'DejaVu Sans,Noto Sans,sans\-serif' | head
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
NotoSans-Regular.ttf: "Noto Sans" "Regular"
NotoSans-Bold.ttf: "Noto Sans" "Bold"
NotoSans-Italic.ttf: "Noto Sans" "Italic"
NotoSans-BoldItalic.ttf: "Noto Sans" "Bold Italic"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
NotoSansCJK-Bold.ttc: "Noto Sans CJK JP" "Bold"
NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"
NotoSansCJK-Bold.ttc: "Noto Sans CJK SC" "Bold"
$ fc-match -a 'DejaVu Sans,Noto Sans,sans\-serif' | wc -l
471

数が多すぎますので headwc -l の結果だけで勘弁ください。

lang

さて、こうして見ますとsans-serif系フォントの中ではNoto Sans CJK JPが積極的にフォールバック先に選ばれているっぽいですね。

$ echo $LANG
ja_JP.UTF-8

そういえば日本語を選んでインストールしたのでした。 全ての言語でNoto Sans CJK JPが優先されるとも思えませんので英語の場合を確認してみましょうか。 言語の指定は lang 属性です。

$ fc-match 'sans\-serif:lang=en'
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

んー? 効いてない?

環境変数 LANG も変えてみましょうか。

$ LANG=en_US.UTF-8 fc-match 'sans\-serif:lang=en'
NotoSans-Regular.ttf: "Noto Sans" "Regular"

あ、Noto Sansに変化しました。

ここから lang を取ると?

$ LANG=en_US.UTF-8 fc-match 'sans\-serif'
NotoSans-Regular.ttf: "Noto Sans" "Regular"

ということは環境変数 LANG のほうが lang 属性よりも優先されている?

最初と逆に LANG が英語で lang が日本語ですと?

$ LANG=en_US.UTF-8 fc-match 'sans\-serif:lang=ja'
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

今度は lang が反映されました。

かなり複雑なルールがありそうです。

フォントパターンの変化

Fontconfigは注文されたフォントパターンに対して実際のフォントを返すわけですがその際に指定されたフォントパターンをそのまま使うわけではありません。 まず設定ファイルに書かれたルールに従ってパターンに変更を加えそれからパターンに合致するフォントを探します。

例えばパターンに単一のファミリー名しか書かなかった場合でもフォールバック先に何かを付け足した場合でも fc-match -s の結果の数が変わらなかったりしますよね。

$ fc-match -s 'DejaVu Sans' | wc -l
150
$ fc-match -s 'DejaVu Sans,sans\-serif' | wc -l
150

これはフォントパターンが補われているからです。

実はFontconfigではフォールバックフォントや総称ファミリー名についてなにか特別な扱いがされているわけではなく、設定ファイルによるフォントパターンの変更という形で表現されています。

設定ファイルによる変更後のフォントパターンを確認するには fc-patten-c オプションを渡します。

$ fc-pattern 'DejaVu Sans'
Pattern has 1 elts (size 16)
        family: "DejaVu Sans"(s)

$ fc-pattern -c 'DejaVu Sans'
Pattern has 6 elts (size 16)
        family: "DejaVu Sans"(s) "DejaVu LGC Sans"(s) "Arimo"(w) "Noto Sans"(w) "Noto Sans CJK SC"(w) "Noto Sans Arabic"(w) "Noto Sans Thai"(w) "Noto Sans Devanagari"(w) "Noto Sans Tamil"(w) "Noto Sans Hebrew"(w) "Noto Sans Bengali"(w) "Noto Sans Telugu"(w) "Noto Sans Kannada"(w) "Noto Sans Malayalam"(w) "Noto Sans Gurmukhi"(w) "Noto Sans Gujarati"(w) "Noto Sans Oriya"(w) "Noto Sans Armenian"(w) "Noto Sans Georgian"(w) "Noto Sans Khmer"(w) "Noto Sans Lao"(w) "Noto Sans Ethiopic"(w) "Noto Sans Myanmar"(w) "Noto Sans Sinhala"(w) "Jomolhari"(w) "Noto Sans Coptic"(w) "Noto Sans Deseret"(w) "Noto Sans TaiTham"(w) "Noto Sans CanadianAboriginal"(w) "Noto Sans Yi"(w) "Noto Sans Tifinagh"(w) "Noto Sans Adlam"(w) "Noto Sans Cherokee"(w) "Noto Sans Chakma"(w) "Noto Sans Osage"(w) "Noto Color Emoji"(w) "Noto Sans Symbols"(w) "Noto Sans Symbols2"(w) "DejaVu Sans"(w) "Noto Sans CJK JP"(s) "DejaVu LGC Sans"(w) "DejaVu Sans"(w) "Bitstream Vera Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus Sans L"(w) "Nimbus Sans"(w) "Nimbus Sans"(w) "Helvetica"(w) "Nimbus Sans"(w) "Nimbus Sans L"(w) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Tahoma"(w) "URW Gothic"(w) "Nimbus Sans"(w) "Nimbus Sans Narrow"(w) "Droid Sans Fallback"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "Microsoft YaHei"(w) "Microsoft JhengHei"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Cosmetica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "Noto Sans CJK JP"(w) "sans-serif"(w) "Roya"(w) "Koodak"(w) "Terafik"(w) "SimHei"(w) "Noto Sans CJK SC"(w) "黑体"(w) "Noto Sans CJK SC"(w) "sans-serif"(w) "sans-serif"(w) "ITC Avant Garde Gothic"(w) "URW Gothic"(w) "sans-serif"(w) "sans-serif"(w) "Helvetica"(w) "Helvetica Narrow"(w) "Nimbus Sans Narrow"(w)
        antialias: True(w)
        hintstyle: 1(i)(w)
        lang: "ja"(w)
        lcdfilter: 1(i)(w)
        prgname: "fc-pattern"(s)

色々と追加されているのが確認できます。

Fontconfigはこの変更後のパターンに一致するフォントを返します。

先頭のDejaVu Sansが最初に選ばれて、続くDejaVu LGC SansとArimoはインストールしていませんので除かれて……まではわかります。 しかし後に続く存在するフォントを押しのけてNoto Sans CJK JPが2番目に選ばれているのは不思議です。 日本語フォントということで lang 属性が関係してきそうなのは想像できます……さて。

おかしな文章でしたので段落丸ごと書き換えさせていただきました。

これを用いて lang の動作を見てみましょう。

$ LANG=ja_JP.UTF-8 fc-pattern 'sans\-serif:lang=en'
Pattern has 2 elts (size 16)
        family: "sans-serif"(s)
        lang: en(s)

$ LANG=ja_JP.UTF-8 fc-pattern -c 'sans\-serif:lang=en'
Pattern has 6 elts (size 16)
        family: "Arimo"(w) "Noto Sans"(w) "Noto Sans CJK SC"(w) "Noto Sans Arabic"(w) "Noto Sans Thai"(w) "Noto Sans Devanagari"(w) "Noto Sans Tamil"(w) "Noto Sans Hebrew"(w) "Noto Sans Bengali"(w) "Noto Sans Telugu"(w) "Noto Sans Kannada"(w) "Noto Sans Malayalam"(w) "Noto Sans Gurmukhi"(w) "Noto Sans Gujarati"(w) "Noto Sans Oriya"(w) "Noto Sans Armenian"(w) "Noto Sans Georgian"(w) "Noto Sans Khmer"(w) "Noto Sans Lao"(w) "Noto Sans Ethiopic"(w) "Noto Sans Myanmar"(w) "Noto Sans Sinhala"(w) "Jomolhari"(w) "Noto Sans Coptic"(w) "Noto Sans Deseret"(w) "Noto Sans TaiTham"(w) "Noto Sans CanadianAboriginal"(w) "Noto Sans Yi"(w) "Noto Sans Tifinagh"(w) "Noto Sans Adlam"(w) "Noto Sans Cherokee"(w) "Noto Sans Chakma"(w) "Noto Sans Osage"(w) "Noto Color Emoji"(w) "Noto Sans Symbols"(w) "Noto Sans Symbols2"(w) "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "Noto Sans CJK JP"(s) "DejaVu LGC Sans"(w) "DejaVu Sans"(w) "Bitstream Vera Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus Sans L"(w) "Nimbus Sans"(w) "Nimbus Sans"(w) "Helvetica"(w) "Nimbus Sans"(w) "Nimbus Sans L"(w) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Tahoma"(w) "URW Gothic"(w) "Nimbus Sans"(w) "Nimbus Sans Narrow"(w) "Droid Sans Fallback"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "Microsoft YaHei"(w) "Microsoft JhengHei"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Cosmetica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "Noto Sans CJK JP"(w) "sans-serif"(s) "Roya"(w) "Koodak"(w) "Terafik"(w) "SimHei"(w) "Noto Sans CJK SC"(w) "黑体"(w) "Noto Sans CJK SC"(w) "sans-serif"(w) "sans-serif"(w) "ITC Avant Garde Gothic"(w) "URW Gothic"(w) "sans-serif"(w) "sans-serif"(w) "Helvetica"(w) "Helvetica Narrow"(w) "Nimbus Sans Narrow"(w)
        antialias: True(w)
        hintstyle: 1(i)(w)
        lang: en(s) "ja"(w)
        lcdfilter: 1(i)(w)
        prgname: "fc-pattern"(s)

$ LANG=ja_JP.UTF-8 fc-match 'sans\-serif:lang=en'
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

$ LANG=en_US.UTF-8 fc-pattern 'sans\-serif:lang=ja'
Pattern has 2 elts (size 16)
        family: "sans-serif"(s)
        lang: ja(s)

$ LANG=en_US.UTF-8 fc-pattern -c 'sans\-serif:lang=ja'
Pattern has 6 elts (size 16)
        family: "Arimo"(w) "Noto Sans"(w) "Noto Sans CJK SC"(w) "Noto Sans Arabic"(w) "Noto Sans Thai"(w) "Noto Sans Devanagari"(w) "Noto Sans Tamil"(w) "Noto Sans Hebrew"(w) "Noto Sans Bengali"(w) "Noto Sans Telugu"(w) "Noto Sans Kannada"(w) "Noto Sans Malayalam"(w) "Noto Sans Gurmukhi"(w) "Noto Sans Gujarati"(w) "Noto Sans Oriya"(w) "Noto Sans Armenian"(w) "Noto Sans Georgian"(w) "Noto Sans Khmer"(w) "Noto Sans Lao"(w) "Noto Sans Ethiopic"(w) "Noto Sans Myanmar"(w) "Noto Sans Sinhala"(w) "Jomolhari"(w) "Noto Sans Coptic"(w) "Noto Sans Deseret"(w) "Noto Sans TaiTham"(w) "Noto Sans CanadianAboriginal"(w) "Noto Sans Yi"(w) "Noto Sans Tifinagh"(w) "Noto Sans Adlam"(w) "Noto Sans Cherokee"(w) "Noto Sans Chakma"(w) "Noto Sans Osage"(w) "Noto Color Emoji"(w) "Noto Sans Symbols"(w) "Noto Sans Symbols2"(w) "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "Noto Sans CJK JP"(s) "DejaVu LGC Sans"(w) "DejaVu Sans"(w) "Bitstream Vera Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus Sans L"(w) "Nimbus Sans"(w) "Nimbus Sans"(w) "Helvetica"(w) "Nimbus Sans"(w) "Nimbus Sans L"(w) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Tahoma"(w) "URW Gothic"(w) "Nimbus Sans"(w) "Nimbus Sans Narrow"(w) "Droid Sans Fallback"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "Microsoft YaHei"(w) "Microsoft JhengHei"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Cosmetica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "Noto Sans CJK JP"(w) "sans-serif"(s) "Roya"(w) "Koodak"(w) "Terafik"(w) "SimHei"(w) "Noto Sans CJK SC"(w) "黑体"(w) "Noto Sans CJK SC"(w) "sans-serif"(w) "sans-serif"(w) "ITC Avant Garde Gothic"(w) "URW Gothic"(w) "sans-serif"(w) "sans-serif"(w) "Helvetica"(w) "Helvetica Narrow"(w) "Nimbus Sans Narrow"(w)
        antialias: True(w)
        hintstyle: 1(i)(w)
        lang: ja(s) "en"(w)
        lcdfilter: 1(i)(w)
        prgname: "fc-pattern"(s)

$ LANG=en_US.UTF-8 fc-match 'sans\-serif:lang=ja,en'
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

うーん? 確かに LANGlang に追加されていますがコマンドライン引数として渡した変形前のフォントパターン文字列に書いた lang のほうがリストの前に来ています。 順番は関係なさそうです。

enのみですとNoto Sansになったのでした。 このケースも一応。

$ LANG=en_US.UTF-8 fc-pattern 'sans\-serif:lang=en'
Pattern has 2 elts (size 16)
        family: "sans-serif"(s)
        lang: en(s)

$ LANG=en_US.UTF-8 fc-pattern -c 'sans\-serif:lang=en'
Pattern has 6 elts (size 16)
        family: "Arimo"(w) "Noto Sans"(w) "Noto Sans CJK SC"(w) "Noto Sans Arabic"(w) "Noto Sans Thai"(w) "Noto Sans Devanagari"(w) "Noto Sans Tamil"(w) "Noto Sans Hebrew"(w) "Noto Sans Bengali"(w) "Noto Sans Telugu"(w) "Noto Sans Kannada"(w) "Noto Sans Malayalam"(w) "Noto Sans Gurmukhi"(w) "Noto Sans Gujarati"(w) "Noto Sans Oriya"(w) "Noto Sans Armenian"(w) "Noto Sans Georgian"(w) "Noto Sans Khmer"(w) "Noto Sans Lao"(w) "Noto Sans Ethiopic"(w) "Noto Sans Myanmar"(w) "Noto Sans Sinhala"(w) "Jomolhari"(w) "Noto Sans Coptic"(w) "Noto Sans Deseret"(w) "Noto Sans TaiTham"(w) "Noto Sans CanadianAboriginal"(w) "Noto Sans Yi"(w) "Noto Sans Tifinagh"(w) "Noto Sans Adlam"(w) "Noto Sans Cherokee"(w) "Noto Sans Chakma"(w) "Noto Sans Osage"(w) "Noto Color Emoji"(w) "Noto Sans Symbols"(w) "Noto Sans Symbols2"(w) "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "DejaVu Sans"(w) "Bitstream Vera Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus Sans L"(w) "Nimbus Sans"(w) "Nimbus Sans"(w) "Helvetica"(w) "Nimbus Sans"(w) "Nimbus Sans L"(w) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Tahoma"(w) "URW Gothic"(w) "Nimbus Sans"(w) "Nimbus Sans Narrow"(w) "Droid Sans Fallback"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "Microsoft YaHei"(w) "Microsoft JhengHei"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Cosmetica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "sans-serif"(s) "Roya"(w) "Koodak"(w) "Terafik"(w) "SimHei"(w) "Noto Sans CJK SC"(w) "黑体"(w) "Noto Sans CJK SC"(w) "sans-serif"(w) "sans-serif"(w) "ITC Avant Garde Gothic"(w) "URW Gothic"(w) "sans-serif"(w) "sans-serif"(w) "Helvetica"(w) "Helvetica Narrow"(w) "Nimbus Sans Narrow"(w)
        antialias: True(w)
        hintstyle: 1(i)(w)
        lang: en(s)
        lcdfilter: 1(i)(w)
        prgname: "fc-pattern"(s)

$ LANG=en_US.UTF-8 fc-match 'sans\-serif:lang=en'
NotoSans-Regular.ttf: "Noto Sans" "Regular"

うん。 やはり lang に順番は関係なく列挙された言語を全て含むフォントが優先されているようです。

と、このような動作確認をしながら設定ファイルを修正していくことになります。

実際のフォントの情報

さらっとNoto Sans CJK JPは英語と日本語の両方を含む前提で話しましたが、こういった実際のフォントの情報も確認したいところですよね。

実際のフォントの情報は fc-query にフォントファイルを渡すと表示できます。

$ fc-query /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc
Pattern has 24 elts (size 32)
 family: "Noto Sans CJK JP"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans CJK JP"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 0(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansCJKjp-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans CJK KR"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans CJK KR"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 1(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansCJKkr-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans CJK SC"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans CJK SC"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 2(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansCJKsc-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans CJK TC"(s)
 familylang: "zh-tw"(s)
 style: "Regular"(s)
 stylelang: "zh-tw"(s)
 fullname: "Noto Sans CJK TC"(s)
 fullnamelang: "zh-tw"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 3(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansCJKtc-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans CJK HK"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans CJK HK"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 4(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansCJKhk-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans Mono CJK JP"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans Mono CJK JP"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 5(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansMonoCJKjp-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans Mono CJK KR"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans Mono CJK KR"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 6(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansMonoCJKkr-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans Mono CJK SC"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans Mono CJK SC"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 7(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansMonoCJKsc-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans Mono CJK TC"(s)
 familylang: "zh-tw"(s)
 style: "Regular"(s)
 stylelang: "zh-tw"(s)
 fullname: "Noto Sans Mono CJK TC"(s)
 fullnamelang: "zh-tw"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 8(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansMonoCJKtc-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

Pattern has 24 elts (size 32)
 family: "Noto Sans Mono CJK HK"(s)
 familylang: "en"(s)
 style: "Regular"(s)
 stylelang: "en"(s)
 fullname: "Noto Sans Mono CJK HK"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 foundry: "GOOG"(s)
 file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
 index: 9(i)(s)
 outline: True(s)
 scalable: True(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 0310: 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00000000
(s)
 lang: aa|ay|bg|bi|bin|br|ch|da|de|en|es|eu|fj|fo|fur|fy|gd|gl|gn|gv|haw|ho|ia|ig|id|ie|io|is|it|ja|ki|ko|kum|lb|mg|nb|nds|nl|nn|no|nr|oc|om|os|pt|rm|ru|sel|sm|sma|smj|so|sq|ss|st|sv|sw|tl|to|ts|uz|vo|wa|xh|yap|zh-cn|zh-hk|zh-mo|zh-sg|zh-tw|zu|an|fil|ht|jv|kj|kwm|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(s)
 fontversion: 131334(i)(s)
 capability: "otlayout:DFLT otlayout:cyrl otlayout:grek otlayout:hang otlayout:hani otlayout:kana otlayout:latn"(s)
 fontformat: "CFF"(s)
 decorative: False(s)
 postscriptname: "NotoSansMonoCJKhk-Regular"(s)
 color: False(s)
 symbol: False(s)
 variable: False(s)

charset は文字を収録しているかどうかをビットマスクで表現したもので量が膨大ですので省略させていただきました。

Noto Sans CJK JPには英語と日本語を含む多数の言語が収録されているのが確認できます。

ただそれだけですと〜KR、〜SC、〜TC、〜HKも条件は同じですし、実際に上の fc-pattern -c の結果ではNoto Sans CJK SCがNoto Sans CJK JPの前に来ているケースもあります。 にも関わらずNoto Sans CJK JPが選ばれているわけですから更になにかありそうですね……。

優先順位

fc-pattern -c の結果をよく見てみますと、Noto Sans CJK JPを含むほとんどの値には (s) が付いていますが、Noto Sans CJK SCは (w) です。 怪しいですね。

マニュアルには優先度について軽い記載がありファミリー名においてstrongはweakより優先されるそうです。

というわけでソースコードもgrepした結果、 (w) はweak、 (s) はstrong、 (=) はsameを意味していました。

ファミリー名のweakは優先順位が落ちますが、言語については LANG 経由で付加されたjaにも(w)が付いているにも関わらず動作が変わっているように見えませんのでこの優先度が影響するのはマニュアル通りファミリー名のみかもしれませんね。

ちなみに (f) はDouble、 (i) はIntのようです。

気になる属性

ついでに気になる属性をいくつか説明しておきます。

描画設定

fc-pattern -c の結果に antialiashintstylelcdfilter も追加されていることからもわかりますように幾つかの描画に関する設定もFontconfigのルールとして記述可能な設定対象です。

ということは設定が反映されているかどうか結果を見たいですよね。

fc-match-v を渡すとこの辺も含めた結果を表示できます。

$ fc-match -v 'DejaVu Sans'
Pattern has 40 elts (size 48)
 family: "DejaVu Sans"(s)
 familylang: "en"(s)
 style: "Book"(s)
 stylelang: "en"(s)
 fullname: "DejaVu Sans"(s)
 fullnamelang: "en"(s)
 slant: 0(i)(s)
 weight: 80(f)(s)
 width: 100(f)(s)
 size: 12(f)(s)
 pixelsize: 12.5(f)(s)
 foundry: "PfEd"(w)
 antialias: True(w)
 hintstyle: 1(i)(w)
 hinting: True(s)
 verticallayout: False(s)
 autohint: False(s)
 globaladvance: True(s)
 file: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"(w)
 index: 0(i)(w)
 outline: True(w)
 scalable: True(w)
 dpi: 75(f)(s)
 scale: 1(f)(s)
 charset:
 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
 # 省略
 01f6: ffffffff ffffefef 00000009 00000000 00000000 00000000 00000000 00000000
(w)
 lang: aa|ab|af|ar|ast|av|ay|az-az|az-ir|ba|bm|be|bg|bi|bin|br|bs|bua|ca|ce|ch|chm|co|cs|cu|cv|cy|da|de|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|ff|fur|fy|ga|gd|gl|gn|gv|ha|haw|he|ho|hr|hu|hy|ia|ig|id|ie|ik|io|is|it|iu|ka|kaa|ki|kk|kl|ku-am|ku-ir|kum|kv|kw|ky|la|lb|lez|ln|lo|lt|lv|mg|mh|mi|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|sah|sco|se|sel|sh|shs|sk|sl|sm|sma|smj|smn|sms|so|sq|sr|ss|st|sv|sw|tg|tk|tl|tn|to|tr|ts|tt|tw|tyv|ug|uk|uz|ve|vi|vo|vot|wa|wen|wo|xh|yap|yi|yo|zu|ak|an|ber-dz|ber-ma|crh|csb|ee|fat|fil|hsb|ht|hz|jv|kab|kj|kr|ku-iq|ku-tr|kwm|lg|li|mn-mn|ms|na|ng|nv|ota|pap-an|pap-aw|qu|quz|rn|rw|sc|sd|sg|sn|su|ty|za(s)
 fontversion: 155320(i)(s)
 capability: "otlayout:DFLT otlayout:arab otlayout:armn otlayout:brai otlayout:cans otlayout:cher otlayout:cyrl otlayout:geor otlayout:grek otlayout:hani otlayout:hebr otlayout:kana otlayout:lao  otlayout:latn otlayout:math otlayout:nko  otlayout:ogam otlayout:runr otlayout:tfng otlayout:thai"(w)
 fontformat: "TrueType"(w)
 embeddedbitmap: True(s)
 decorative: False(s)
 lcdfilter: 1(i)(w)
 namelang: "ja"(s)
 prgname: "fc-match"(s)
 postscriptname: "DejaVuSans"(w)
 color: False(w)
 symbol: False(s)
 variable: False(s)
 noto_cjk: False(w)
 noto_hinted: False(w)

この結果にはフォントの情報と設定が混じってます。

Fontconfigから得た結果をどこまで使うかはアプリ次第ですのでこの辺は参照しないアプリも稀によくあります。

prgname

詳しいことは後日に回しますがアプリケーション毎に設定を変えることもできます。 で、当たり前ですが fc-matchfc-match というひとつのアプリケーションです。

他のアプリケーションに向けた設定を fc-match を通じて確認するには prgname 属性を指定します。 値は実行ファイル名です。 Windowsでは拡張子 .exe は除かれるようです。

$ fc-match 'sans\-serif:prgname=firefox'

もっともDebianやUbuntuやKDE neonの初期設定ではアプリケーション毎の設定なんてひとつもありませんので、気にする必要はありません。 そういった設定をしたくなったら思い出していただければ。

ユーザー定義属性

上の fc-match -v の結果をよく見てみますと noto_cjknoto_hinted という属性があります。 FontconfigはNotoフォント専用の属性を直接サポートしているのでしょうか……ということはもちろんないです。 念の為にソースコードをgrepしても出てきません。

これは単にFontconfig側で定義されていない属性であっても設定ファイルの中では変数のように使うことができてそれが表示されているというだけです。