Debian13で起こるフォント名の文字化けの原因はfontconfig

目次
  1. 概要
  2. 凡例
  3. IPA P明朝
  4. IPA明朝
  5. モトヤLマルベリ3等幅
  6. 衡山毛筆フォント行書
  7. 衡山毛筆フォント草書
  8. YOzS90bi
  9. YOzS90i
  10. YOzS
  11. YOzSF90bi
  12. VL Pゴシック
  13. BIZ UDゴシック
  14. BIZ UDゴシック

公開日 2026-02-02 更新日 2026-02-06

概要

Debianでフォント名を管理する、fontconfig がインストールされているフォントの日本語名(family名)を報告するときに、本来であればshift_jisでデコードすべきMacintosh用のバイト列をutf_16_beでデコードするので、フォントによっては意味のない文字列になってしまい、フォントの選択が困難になります。

また、Macintosh用の英語でないけれどもencodeIDがRomanのバイト列をutf_16_beでデコードしている可能性があります。

この現象の起こる環境は、Debian13で、fontconfig の version は 2.15.0-2.3 です。fc-list コマンドでフォント名の文字化けをみせてくれます。

ttfファイルのnameテーブルを確認して検証しました。

確認した現象 フォント名と検証記事
(ページ内リンク)
shift_jisでデコードすることになっているバイト列をutf_16_beでデコードしていることが確実にわかる。
ただしshift_jisではデコードしていないと断言できないけど。
"IPA P明朝" "YOzS90bi" "YOzS"
shift_jisでデコードすることになっているバイト列をshift_jisでデコードせずに
utf_16_beでデコードしていることが確実になった。
"YOzSF90bi"
多分フォント側のミスで、mac,roman,japanese の指定がしてあるバイト列を utf_16_beでデコードしているという例がある。
ただし、 ascii でデコードして失敗するので utf_16_be でデコードしたという可能性もある。
"モトヤLマルベリ3等幅"
多分フォント側のミスで、mac,roman,言語不明 の指定になっているバイト列を ascii でなく utf_16_be でデコードしている例がある "衡山毛筆フォント行書"

ttfフォントファイル内の記述のミスがあった場合、無視する設計になっているので、文字化けとして現れるのはfontconfig側の問題です。

fonfconfigを使用してフォント名を取得してフォント選択をするソフトウェアは影響を受けます。Libreoffice, GIMP, (The GNOME Projectの)フォント(閲覧ソフト), エディタのフォント選択などです。

文字化けの現象そのものは「フォント名の文字化け-フォント側に問題がないことを確認」を参照してください。

凡例

フォントデータの記述順

  1. 'fc-list -vb' コマンドで名前(の化け具合)を確認。
  2. ttfファイルのパスとファイル名、name-offsetの値
  3. 01familynameについて、platformID、encodingID、languageID に従ってバイト列をデコードする。(必要に応じて別デコード)
  4. 解釈を試みる
  5. 02styleについて、platformID、encodingID、languageID に従ってバイト列をデコードする。(必要に応じて別デコード)

表の項目の意味

開始位置:name-offsetに別のoffset値も加えてバイト列の先頭の位置。これが同じなら同じバイト列を共用しているということ。

pel:platformID, encodeID, languageID の頭文字で、ここだけの略記。色々な組み合わせが考えられるが、調べた中ではよく出てくる組み合わせは2件を除くと4パターンしかない。例外の2件はどうやら記述ミスと考えられる。このパターンでバイト列がどのようにエンコードされているかを判断する。

pel(略記)の意味とそこから決まるエンコード(エンコードの表記はpython3で使われているもの)
platformID encodeID languageIDpel(略記)pelから決まるエンコード備考
Macintosh Roman Englishmac_enascii
Macintosh Japanese Japanesemac_jashift_jisDebian13のfontconfigではutf_16_beでデコードしてしまうようだ
Windows UnicodeBMP English-USwin_enutf_16_be
Windows UnicodeBMP Japanesewin_jputf_16_be
Macintosh Roman Japanesemacromjaasciiromなのでasciiと判断できるが、バイト列を見るとshift_jis
Macintosh Roman 0411macrom??asciiromなのでasciiと判断。0411はwinならJapaneseと判断されるがmacだと該当がない

呼出元:この開始位置のバイト列を指しているpelとnameIDのリスト。複数のところから呼び出す場合がある。

nameID:いろいろな名前が設定できるが、01のfamilyと02のstyleに注目する。

詳しくは「フォント名の文字化け-フォント側に問題がないことを確認」の NameRecord を参照。

解釈の方針

まずlanguageIDがen(英語)のものすべて、つまり、mac_enとwin_enのそれぞれをデコードして同一ならまとめると考える。

次にlanguageIDがja(日本語)のものすべてをそれぞれデコードして、enと同じものは省き、日本語独自のものは同一ならまとめ、異なる場合は併記すると考える。

mac_jaは本来ならshift_jisだが、utf_16_beでデコードしているかもしれないということを考慮する。

utf_16_beはその仕組みから、shift_jisでエンコードされたものも正常にデコードできることが多い。正常にデコードできたかは、得られた文字列をもう一度エンコードして元のバイト列と同一になるかで判断しているのではないか。それなら我々にとって意味不明な文字列でもデコードに成功したと判断されることはあり得る。

IPA P明朝

family: "IPA P明朝"(s) "IPAPMincho"(s) "䥐䅐䵩湣桯"(s)
familylang: "ja"(s) "en"(s) "ja"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf 0x781ea8

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x782104mac_enmac_en01 ascii49 50 41 50 4d 69 6e 63 68 6f IPAPMincho
0x782452win_enwin_en01 utf1600 49 00 50 00 41 00 50 00 4d 00 69 00 6e 00 63 00 68 00 6f IPAPMincho
0x782258mac_jamac_ja01 shift-jis49 50 41 50 4d 69 6e 63 68 6f IPAPMincho䥐䅐䵩湣桯(utf16)
0x7826fawin_jawin_ja01 utf1600 49 00 50 00 41 00 20 00 50 66 0e 67 1d IPA P明朝
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"IPAPMincho"になるので、まとめて "IPAPMincho"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、macは"IPAPMincho"でenと同じになるので省略。winは"IPA P明朝"になるので、"IPA P明朝"(ja)とする。
  3. のはずであるが、"䥐䅐䵩湣桯"もjaとして記録されている。ということは、mac_jaのバイト列をutf_16_beでデコードしているという結論になる
  4. mac_jaのバイト列をshift_jisでデコードしていないということは確証がないが、shift_jisでデコード成功しているのに、さらにutf_16_beでもデコードを試みるというのはありそうにない。
  5. ロケールから、jaを先行して報告するのは説明がつくが、"䥐䅐䵩湣桯"(ja)を最後にしているのは理由が見つからない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x78210emac_enmac_en02 ascii52 65 67 75 6c 61 72 Regular
0x782466win_enwin_en02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x782262mac_jamac_ja02 shift-jis52 65 67 75 6c 61 72 Regular剥杵污�(utf16)
0x782708win_jawin_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"Regular"になるので、まとめて "Regular"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、どちらも"Regular"でenと同じになるので省略。
  3. ということなのかもしれないが、familyをutf_16_beでデコードしているのに、styleはshift_jisというのもあやしい。そこで、utf_16_beでデコードしていると考えると、"剥杵污�"となる。utf_16は2バイトコードなので、6バイトまではデーコードできたが、最後の1バイトは正しくデコードできなかった。そこでこれを無視してmac_jaは報告にはいらず、win_jaが"Regular"でenと同じになるので省略という解釈もありうる。

より詳しくは「フォント名の文字化けの原因をさぐる」の"IPA P明朝"で困った、または"IPA P明朝"の名前文字列のデコード一覧を参照

IPA明朝

family: "IPA明朝"(s) "IPAMincho"(s)
familylang: "ja"(s) "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf 0x78215c

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x7823b8mac_enmac_en01 ascii49 50 41 4d 69 6e 63 68 6f IPAMincho
0x7826fewin_enwin_en01 utf1600 49 00 50 00 41 00 4d 00 69 00 6e 00 63 00 68 00 6f IPAMincho
0x782508mac_jamac_ja01 shift-jis49 50 41 4d 69 6e 63 68 6f IPAMincho䥐䅍楮捨�(utf16)
0x78299ewin_jawin_ja01 utf1600 49 00 50 00 41 66 0e 67 1d IPA明朝
  1. "IPA P明朝"とほとんど同じだが、mac_jaで、utf_16_beでのデコードはバイト列が奇数なので失敗する。そこでwin_jaからの"IPA明朝"だけが日本語名となる。
  2. もちろん、"IPA P明朝"と比較しなければ、mac_jaはshift_jisでデコードされ、"IPAMincho"となってenと同じなので省略されたという解釈になるかもしれない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x7823c1mac_enmac_en02 ascii52 65 67 75 6c 61 72 Regular
0x782710win_enwin_en02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x782511mac_jamac_ja02 shift-jis52 65 67 75 6c 61 72 Regular剥杵污�(utf16)
0x7829a8win_jawin_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
  1. "IPA P明朝"のstyleとまったく同じ。

より詳しくは「フォント名の文字化けの原因をさぐる」のIPA明朝は名前が2つ、またはIPA明朝の名前文字列のデコード一覧を参照

モトヤLマルベリ3等幅

debianのパッケージに、fonts-motoya-l-maruberi という名前で登録されているもので、解説には、「モトヤ L マルベリ 3 等幅 - 丸ゴシック、"マルベリ" フォント」とあります。

family: "モトヤLマルベリ3等幅"(s) "MotoyaLMaru"(s) "莂荧莄䲃綃讃碃訳鎙閝"(s)
familylang: "ja"(s) "en"(s) "ja"(s)
style: "Regular"(s) "W3 mono"(s)
stylelang: "ja"(s) "en"(s)

/usr/share/fonts/truetype/motoya-l-maruberi/MTLmr3m.ttf 0x2b8dbc

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x2b8f4amac_enmac_en01 ascii4d 6f 74 6f 79 61 4c 4d 61 72 75 MotoyaLMaru
0x2b9086win_enwin_en01 utf1600 4d 00 6f 00 74 00 6f 00 79 00 61 00 4c 00 4d 00 61 00 72 00 75 MotoyaLMaru
0x2b8fd3macromjamacromja01 ascii83 82 83 67 83 84 4c 83 7d 83 8b 83 78 83 8a 33 93 99 95 9d ���g��L�}���x��3����モトヤLマルベリ3等幅(sjis)
莂荧莄䲃綃讃碃訳鎙閝(utf16)
0x2b9248win_jawin_ja01 utf1630 e2 30 c8 30 e4 00 4c 30 de 30 eb 30 d9 30 ea 00 33 7b 49 5e 45 モトヤLマルベリ3等幅
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"MotoyaLMaru"になるので、まとめて "MotoyaLMaru"(en) とする。
  2. jaはwin_jaがある。指定通りデコードすると"モトヤLマルベリ3等幅"になる。mac_jaはなく、macromja、つまりencodeIDがRomanであり、asciiでデコードする指示になっている。ところがバイト列はasciiの範囲になくshift_jisなので、フォント側の間違いと思われる。encodeIDをJapaneseにしていれば、デコード結果は"モトヤLマルベリ3等幅"でwin_jpと同一である。
  3. ところが、"莂荧莄䲃綃讃碃訳鎙閝"がjaとして記録されている。ということは、macromjaのバイト列をutf_16_beでデコードしているという結論になる。指示通りasciiでデコードしたら失敗するので、utf_16_beでもデコードしてみたということなら間違いとはいえないが、はじめからutf_16_beでデコードしたとしても同じ結果になることは覚えておきたい。
  4. mac_jaのバイト列を指示通りasciiでデコードして失敗したという確証がないが、shift_jisでデコードしていないというのは確かなようだ。
  5. ロケールから、jaを先行して報告するのは説明がつくが、"莂荧莄䲃綃讃碃訳鎙閝"(ja)を最後にしているのは理由が見つからない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x2b8f55mac_enmac_en02 ascii57 33 20 6d 6f 6e 6f W3 mono
0x2b909cwin_enwin_en02 utf1600 57 00 33 00 20 00 6d 00 6f 00 6e 00 6f W3 mono
0x2b8fe7macromjamacromja02 ascii52 65 67 75 6c 61 72 RegularRegular(sjis)
剥杵污�(utf16)
0x2b925ewin_jawin_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"W3 mono"になるので、まとめて "W3 mono"(en) とする。たぶんWeightが3で、等幅という意味なのだろう。02のstyleの意図からすると、Regular, Italic, Bold, Bold-Italic のどれかであるべきで、その他のバリエーションは違うnameIDで指定するようになっているのだが、規格の決められた経緯や、言語の事情、規格のわかりにくさなどの理由で浸透しないのだろう。
  2. jaはwin_jaがある。指定通りデコードすると"Regular"になる。やはりmac_jaはなく、macromja、つまりencodeIDがRomanであり、asciiでデコードする指示だが、バイト列はasciiの範囲にあるので"Regular"になる(shift_jisとしてデコードしても"Regular"になる)。win_jpと一致するので、"Regular"(ja)となる。
  3. とはいっても、utf_16_beでデコードして失敗し(奇数バイトなので必ず失敗する)、jaの候補から外されて、win_jaが採用され、"Regular"(ja)となった可能性もある。
  4. styleもjaとenの値が違えばja先行して併記するということが判明した。

より詳しくは「フォント名の文字化けの原因をさぐる」のモトヤLマルベリ3等幅、またはモトヤLマルベリ3等幅の名前文字列のデコード一覧を参照

衡山毛筆フォント行書

family: "衡山毛筆フォント行書"(s) "KouzanBrushFontGyousyo"(s) "䭯畺慮䉲畳框潮瑇祯畳祯"(s)
familylang: "ja"(s) "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/kouzan-mouhitsu/kouzan-mouhitsu-gyosho.ttf 0x220

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0xd46win_enwin_en01 utf1600 4b 00 6f 00 75 00 7a 00 61 00 6e 00 42 00 72 00 75 00 73 00 68 00 46 00 6f 00 6e 00 74 00 47 00 79 00 6f 00 75 00 73 00 79 00 6f KouzanBrushFontGyousyo
0x1d46win_jawin_ja01 utf1688 61 5c 71 6b db 7b 46 30 d5 30 a9 30 f3 30 c8 88 4c 66 f8 衡山毛筆フォント行書
0x446macrom??macrom??01 ascii4b 6f 75 7a 61 6e 42 72 75 73 68 46 6f 6e 74 47 79 6f 75 73 79 6f KouzanBrushFontGyousyoKouzanBrushFontGyousyo(sjis)
䭯畺慮䉲畳框潮瑇祯畳祯(utf16)
  1. enはwin_enしかない。指定通りデコードすると"KouzanBrushFontGyousyo"になるので、"KouzanBrushFontGyousyo"(en) とする。
  2. jaもwin_jaしかない。指定通りデコードすると"衡山毛筆フォント行書"になる。"衡山毛筆フォント行書"(ja)となる。
  3. mac_jaはなく、macrom?? が残っている。上にも書いたが、??は0411で、winならJapaneseと判断されるIDだが、macだと該当がないlangageIDを書いてしまったいうこと。つまりenでもjaでもない第三の不明な言語と扱われたようだ。
  4. macなのでencodeIDがRomanであり、asciiでデコードする指示。バイト列はasciiの範囲なので、デコードすれば"KouzanBrushFontGyousyo"になる(バイト列はshift_jisとしてデコードしとも"KouzanBrushFontGyousyo")。enと一致するので省略されるはずだ。
  5. ところが、"䭯畺慮䉲畳框潮瑇祯畳祯"が言語表記なしで報告されている。ということは、Romanのバイト列をasciiでなくutf_16_beでデコードしているという結論になる。ascii指示をutf_16_beでデコードするのはびっくりだが、0411というlanguageIDを優先してutf_16_beとしたのなら、まあ、わからないでもない。
  6. ロケールから、jaを先行して報告するのは説明がつく。何の言語か不明な"䭯畺慮䉲畳框潮瑇祯畳祯"を最後にしているのは妥当かもしれない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0xf46win_enwin_en02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x1f46win_jawin_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x546macrom??macrom??02 ascii52 65 67 75 6c 61 72 RegularRegular(sjis)
剥杵污�(utf16)
  1. enはwin_enのみであり、指定通りデコードすると、"Regular"になる。
  2. jaもwin_jaがある。指定通りデコードすると、"Regular"でenと同じになるので省略。
  3. さらに、第三の言語macrom??があるが、指定通りデコードすると、"Regular"でenと同じになるので省略。
  4. となるはずだが、Romanのバイト列をasciiでなくutf_16_beでデコードしているという疑いが生じている。ここではutf_16_beでデコードすると失敗するので、無視されたとも考えられるので結論は出ない。

より詳しくは「フォント名の文字化けの原因をさぐる」の衡山毛筆フォント行書-YOz以外のも見てみる、または衡山毛筆フォント行書の名前文字列のデコード一覧を参照

衡山毛筆フォント草書

family: "衡山毛筆フォント草書"(s) "KouzanBrushFontSousyo"(s)
familylang: "ja"(s) "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/kouzan-mouhitsu/KouzanBrushFontSousyo.ttf 0x220

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0xd46win_enwin_en01 utf1600 4b 00 6f 00 75 00 7a 00 61 00 6e 00 42 00 72 00 75 00 73 00 68 00 46 00 6f 00 6e 00 74 00 53 00 6f 00 75 00 73 00 79 00 6f KouzanBrushFontSousyo
0x1d46win_jawin_ja01 utf1688 61 5c 71 6b db 7b 46 30 d5 30 a9 30 f3 30 c8 83 49 66 f8 衡山毛筆フォント草書
0x446macrom??macrom??01 ascii4b 6f 75 7a 61 6e 42 72 75 73 68 46 6f 6e 74 53 6f 75 73 79 6f KouzanBrushFontSousyoKouzanBrushFontSousyo(sjis)
䭯畺慮䉲畳框潮瑓潵獹�(utf16)
  1. enはwin_enしかない。指定通りデコードすると"KouzanBrushFontSousyo"になるので、"KouzanBrushFontSousyo"(en) とする。
  2. jaもwin_jaしかない。指定通りデコードすると"衡山毛筆フォント草書"になる。"衡山毛筆フォント草書"(ja)となる。
  3. mac_jaはなく、macrom?? が残っている。上にも書いたが、??は0411で、winならJapaneseと判断されるIDだが、macだと該当がないlangageIDを書いてしまったいうこと。つまりenでもjaでもない第三の不明な言語と扱われたようだ。
  4. macなのでencodeIDがRomanであり、asciiでデコードする指示。バイト列はasciiの範囲なので、デコードすれば"KouzanBrushFontSousyo"になる(バイト列はshift_jisとしてデコードしとも"KouzanBrushFontSousyo")。enと一致するので省略されたと解釈できる。
  5. けれども、Romanのバイト列をasciiでなくutf_16_beでデコードしたと考えても、デコードが失敗になるので無視されたと考えても同じ結論になる。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0xf46win_enwin_en02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x1f46win_jawin_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x546macrom??macrom??02 ascii52 65 67 75 6c 61 72 RegularRegular(sjis)
剥杵污�(utf16)
  1. 衡山毛筆フォント行書のstyleと全く同じ。

より詳しくは「フォント名の文字化けの原因をさぐる」の衡山毛筆フォント草書はどうか、または衡山毛筆フォント草書の名前文字列のデコード一覧を参照

YOzS90bi

family: "奏穓㤰扩"(s) "YOzS90bi"(s)
familylang: "ja"(s) "en"(s)
style: "䉯汤"(s) "Bold"(s)
stylelang: "ja"(s) "en"(s)

/usr/share/fonts/truetype/yozvox-yozfont/YOzBS_90i.ttf 0x9ac578

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x9ac724win_enwin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 39 00 30 00 62 00 69 YOzS90bi
0x9ac751mac_enmac_en,mac_ja01,03,04,06,07 ascii59 4f 7a 53 39 30 62 69 YOzS90bi
0x9ac724win_jawin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 39 00 30 00 62 00 69 YOzS90bi
0x9ac751mac_jamac_en,mac_ja01,03,04,06,07 shift-jis59 4f 7a 53 39 30 62 69 YOzS90bi奏穓㤰扩(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"YOzS90bi"になるので、まとめて "YOzS90bi"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、どちらも"YOzS90bi"でenと同じになるので省略のはずであった。特に、mac_jaはshift_jisでデコードして"YOzS90bi"になるはずである。
  3. ところが、"奏穓㤰扩"もjaとして記録されている。ということは、mac_jaのバイト列をutf_16_beでデコードしているという結論になる
  4. mac_jaのバイト列をshift_jisでデコードしていないということは確証がないが、shift_jisでデコード成功しているのに、さらにutf_16_beでもデコードを試みるというのはありそうにない。
  5. ロケールから、jaを先行して報告するので、"奏穓㤰扩"(ja)が先になる。win_jaのフォント名をenと同じにしたことがYOzフォントが文字化けで目立ってしまった一因であるが、YOzに非はない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x9ac761win_enwin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold
0x9ac771mac_enmac_en,mac_ja02 ascii42 6f 6c 64 Bold
0x9ac761win_jawin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold
0x9ac771mac_jamac_en,mac_ja02 shift-jis42 6f 6c 64 Bold䉯汤(utf16)
  1. styleも全く同じ流れで"䉯汤"(ja)が現れる。

より詳しくは「フォント名の文字化け-フォント側に問題がないことを確認」のNameRecordの実例を読む、またはpythonでデコードしてみるを参照

YOzS90i

family: "YOzS90i"(s)
familylang: "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/yozvox-yozfont/YOzRS_90i.ttf 0x98b520

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x98b6dcwin_enwin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 39 00 30 00 69 YOzS90i
0x98b71cmac_enmac_en,mac_ja01,03,04,06,07 ascii59 4f 7a 53 39 30 69 YOzS90i
0x98b6dcwin_jawin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 39 00 30 00 69 YOzS90i
0x98b71cmac_jamac_en,mac_ja01,03,04,06,07 shift-jis59 4f 7a 53 39 30 69 YOzS90i奏穓㤰�(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"YOzS90i"になるので、まとめて "YOzS90i"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、どちらも"YOzS90i"でenと同じになるので省略したと解釈すれば平和に説明できる。
  3. けれども、mac_jaでもバイト列をutf_16_beでデコードしようとして失敗し、無視されたとしても説明がつく。
  4. enしかないので、"YOzS90i"(en)のみの報告となる。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x98b6eawin_enwin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x98b715mac_enmac_en,mac_ja02 ascii52 65 67 75 6c 61 72 Regular
0x98b6eawin_jawin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x98b715mac_jamac_en,mac_ja02 shift-jis52 65 67 75 6c 61 72 Regular剥杵污�(utf16)
  1. styleも全く同じ流れで"Regular"(en)のみ報告される。

より詳しくは「フォント名の文字化けの原因をさぐる」のYOzS90iは文字化けしていない、またはYOzS90iフォントの名前文字列のデコード一覧を参照

YOzS

family: "奏穓"(s) "YOzS"(s)
familylang: "ja"(s) "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/yozvox-yozfont/YOzRS_.ttf 0x8c8a34

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x8c8c13win_enwin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 YOzS
0x8c8c2amac_enmac_en,mac_ja01,03,04,06,07 ascii59 4f 7a 53 YOzS
0x8c8c13win_jawin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 YOzS
0x8c8c2amac_jamac_en,mac_ja01,03,04,06,07 shift-jis59 4f 7a 53 YOzS奏穓(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"YOzS"になるので、まとめて "YOzS"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、どちらも"YOzS"でenと同じになるので省略のはずであった。特に、mac_jaはshift_jisでデコードして"YOzS"になるはずである。
  3. ところが、"奏穓"もjaとして記録されている。ということは、mac_jaのバイト列をutf_16_beでデコードしているという結論になる
  4. mac_jaのバイト列をshift_jisでデコードしていないということは確証がないが、shift_jisでデコード成功しているのに、さらにutf_16_beでもデコードを試みるというのはありそうにない。
  5. ロケールから、jaを先行して報告するので、"奏穓"(ja)が先になる。win_jaのフォント名をenと同じにしたことがYOzフォントが文字化けで目立ってしまった一因であるが、YOzに非はない。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x8c8bf0win_enwin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x8c8c23mac_enmac_en,mac_ja02 ascii52 65 67 75 6c 61 72 Regular
0x8c8bf0win_jawin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x8c8c23mac_jamac_en,mac_ja02 shift-jis52 65 67 75 6c 61 72 Regular剥杵污�(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"Regular"になるので、まとめて "Regular"(en) とする。
  2. jaもmac_ja,win_jaがある。それぞれの指定通りデコードすると、どちらも"Regular"でenと同じになるので省略。
  3. ということなのかもしれないが、familyをutf_16_beでデコードしているのに、styleはshift_jisというのもあやしい。そこで、utf_16_beでデコードしていると考えると、"剥杵污�"となる。utf_16は2バイトコードなので、6バイトまではデーコードできたが、最後の1バイトは正しくデコードできなかった。そこでこれを無視してmac_jaは報告にはいらないという解釈もありうる。

より詳しくは「フォント名の文字化けの原因をさぐる」のYOzSはフォント名だけ文字化け、またはYOzSフォントの名前文字列のデコード一覧を参照

YOzSF90bi

family: "奏穓䘹ぢ楘"(s) "YOzSF90bi"(s)
familylang: "ja"(s) "en"(s)
style: "䉯汤"(s) "Bold"(s)
stylelang: "ja"(s) "en"(s)

/usr/share/fonts/truetype/yozvox-yozfont/YOzBSF90i.ttf 0x9ac974

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x9acb20win_enwin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 46 00 39 00 30 00 62 00 69 YOzSF90bi
0x9acb4fmac_enmac_en,mac_ja01,03,04,06,07 ascii59 4f 7a 53 46 39 30 62 69 YOzSF90bi
0x9acb20win_jawin_en,win_ja01,03,04,06,07 utf1600 59 00 4f 00 7a 00 53 00 46 00 39 00 30 00 62 00 69 YOzSF90bi
0x9acb4fmac_jamac_en,mac_ja01(mac_en),
03,04,06,07
shift-jis59 4f 7a 53 46 39 30 62 69 YOzSF90bi奏穓䘹ぢ�(utf16)
0x9acb4fmac_jamac_ja01(mac_ja) shift-jis59 4f 7a 53 46 39 30 62 69 58 YOzSF90biX奏穓䘹ぢ楘(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"YOzSF90bi"になるので、まとめて "YOzSF90bi"(en) とする。
  2. win_jaは指定通りデコードすると、"YOzSF90bi"でenと同じになるので省略になる。
  3. 実は分けて書いてあるがwin_enもwin_jaもnameID01,03-07まですべて同じ文字列が指定されている。winについてはenもjaもutf_16_beでデコードすることになっているので問題ない。
  4. mac_enはascii、mac_jaはshift_jisとエンコードが異なるが、asciiの範囲であればデコードしたときに同じ文字列になるので問題ない。
  5. けれども、nameIDが01の場合だけ特殊な仕組みにしている。バイト列のスペースは10バイト分を確保してあるのだが、nameIDが01でなおかつmac_jaときだけ10バイトの長さだけれども、その他はmac_enもmac_jaも9バイトの長さが指定されている。こういう指定はttfの仕様上間違いではない。
  6. なので、mac_jaのnameID01の部分を指定通りshift_jisでデコードすると"YOzSF90biX"になる。enの名前とは"X"がついている分、同一ではない。ところがフォント名で報告されていないので、shift_jisではデコードされていないことになる。報告されているのは"奏穓䘹ぢ楘"で、mac_jaのバイト列をutf_16_beでデコードしているという結論になる。utf_16_beでのデコードが成功するのは10バイトになっているからである。YOzのフォント名にXの記号も入ることがあるが、"bi"記号の後に来ることはないので、なぜこうなっているかは謎である。
  7. これで、mac_jaのバイト列をshift_jisでデコードしていないということが明確になったといえる。
  8. ロケールから、jaを先行して報告するので、"奏穓䘹ぢ楘"(ja)が先になる。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x9acb59win_enwin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold
0x9acb71mac_enmac_en,mac_ja02 ascii42 6f 6c 64 Bold
0x9acb59win_jawin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold
0x9acb71mac_jamac_en,mac_ja02 shift-jis42 6f 6c 64 Bold䉯汤(utf16)
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"Bold"になるので、まとめて "Bold"(en) とする。
  2. win_jaも指定通りデコードすると、"Bold"でenと同じになるので省略になる。
  3. mac_jaは本来はshift_jisでデコードするべき所、utf_16_beでデコードして"䉯汤"を得る。これを"䉯汤"(ja)として採用する。
  4. ロケールから、jaを先行して報告するので、"䉯汤"(ja)が先になる。

より詳しくは「フォント名の文字化けの原因をさぐる」のYOzSF90biは奇数バイトなのに、 またはYOzSF90biフォントの名前文字列のデコード一覧を参照

Debian12でのYOzSF90bi(2026-2-6の追記)

Debian12では、文字化けはこらない。これは前から確認済みだが、fc-listでは、次のように報告される。

family: "YOzSF90bi"(s)
familylang: "en"(s)
style: "Bold"(s)
stylelang: "en"(s)

しかし、nameテーブルの内容は全く同じなので、"奏穓䘹ぢ楘"にならないとしても、YOzSF90biXは日本語名として出てきそうなのに出てきていない。win_jaではenと同じ文字列になり省略になるが、mac_jaではのnameID=10だけ10バイトなのでYOzSF90biXになり、ja独自の文字列となるからだ。

この原因はわからない。ただひとつ推測するとすればnameオフセットテーブルでは同じ開始位置のバイト列を複数のnameIDで使い回されるので、lengthも同じであろうと処理される可能性がある。開始位置が同じでlengthが異なるという指定はあまりないことなので、確認が漏れていたのではないだろうか。

VL Pゴシック

family: "VL Pゴシック"(s) "VL PGothic"(s)
familylang: "ja"(s) "en"(s)
style: "regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf 0x3c6c5c

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x3c6fd4win_enwin_en01 utf1600 56 00 4c 00 20 00 50 00 47 00 6f 00 74 00 68 00 69 00 63 VL PGothic
0x3c6feamac_enmac_en01 ascii56 4c 20 50 47 6f 74 68 69 63 VL PGothic
0x3c7187win_jawin_ja01 utf1600 56 00 4c 00 20 00 50 30 b4 30 b7 30 c3 30 af VL Pゴシック
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"VL PGothic"になるので、まとめて "VL PGothic"(en) とする。
  2. jaについてはmac_jaがない。win_jaは指定通りデコードすると、"VL Pゴシック"でenと異なるので、"VL Pゴシック"(ja)として報告される。とてもすっきり。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x3c6ff5win_enwin_en02 utf1600 72 00 65 00 67 00 75 00 6c 00 61 00 72 regular
0x3c7005mac_enmac_en02 ascii72 65 67 75 6c 61 72 regular
  1. enはmac_en,win_enがあり、それぞれの指定通りデコードすると、どちらも"regular"になるので、まとめて "regular"(en) とする。
  2. 他のフォントは"Regular"であるが、小文字のまま受け入れられている。
  3. jaについてはmac_jaもwin_jaも存在しないので、enのみとなる。とてもすっきり。

より詳しくは「フォント名の文字化けの原因をさぐる」の"VL Pゴシック"はデフォルトの日本語フォント、 または"VL Pゴシック"の名前文字列のデコード一覧を参照

BIZ UDゴシック

family: "BIZ UDゴシック"(s) "BIZ UDGothic"(s)
familylang: "ja"(s) "en"(s)
style: "Regular"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/bizud-gothic/BIZUDGothic-Regular.ttf 0x45b910

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x45bad4win_enwin_en01,04 utf1600 42 00 49 00 5a 00 20 00 55 00 44 00 47 00 6f 00 74 00 68 00 69 00 63 BIZ UDGothic
0x45bd86win_jawin_ja01,04 utf1600 42 00 49 00 5a 00 20 00 55 00 44 30 b4 30 b7 30 c3 30 af BIZ UDゴシック
  1. mac_enもmac_jaもない。winだけで完結していて、わかりやすいが、macでも使えるかは不明。
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x45baecwin_enwin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
0x45baecwin_jawin_en,win_ja02 utf1600 52 00 65 00 67 00 75 00 6c 00 61 00 72 Regular
  1. mac_enもmac_jaもない。winだけで完結していて、わかりやすいが、macでも使えるかは不明。

より詳しくは「フォント名の文字化けの原因をさぐる」の"BIZ UDゴシック Regular"から先に、 または"BIZ UDゴシック Regular"の名前文字列のデコード一覧を参照

BIZ UDゴシック

"BIZ UDゴシック"はファミリー名なので、RegularもBoldも同じ名前になる。日本語フォント名では少数派だがttfの仕様を見ると、これが本来の姿なのだそうだ。

nameID=04のfullnameにはRegular,Boldがついて区別される。ttfファイルは別になっている。解釈についてはRegularと同じなので省略。

family: "BIZ UDゴシック"(s) "BIZ UDGothic"(s)
familylang: "ja"(s) "en"(s)
style: "Bold"(s)
stylelang: "en"(s)

/usr/share/fonts/truetype/bizud-gothic/BIZUDGothic-Bold.ttf 0x454690

nameID=01,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x454854win_enwin_en01 utf1600 42 00 49 00 5a 00 20 00 55 00 44 00 47 00 6f 00 74 00 68 00 69 00 63 BIZ UDGothic
0x454b26win_jawin_ja01 utf1600 42 00 49 00 5a 00 20 00 55 00 44 30 b4 30 b7 30 c3 30 af BIZ UDゴシック
nameID=02,バイト列とデコード後文字列
開始位置pel呼出元pel呼出元nameID encodeバイト列(デコード前の文字列)デコード後文字列別デコード
0x45486cwin_enwin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold
0x45486cwin_jawin_en,win_ja02 utf1600 42 00 6f 00 6c 00 64 Bold

より詳しくは「フォント名の文字化けの原因をさぐる」の"BIZ UDゴシック Bold"、 または"BIZ UDゴシック Bold"の名前文字列のデコード一覧を参照