動かざることバグの如し

近づきたいよ 君の理想に

Alpine Linuxで日本語の明朝体フォントを使えるようにする方法

環境

やりたいこと

Dockerで軽量イメージを作る上で欠かせないAlpine Linuxで日本語フォントを使う場合、実は

RUN apk add font-ipa fontconfig && fc-cache -f

を実行するだけで日本語は表示できる。が、今回は明朝体もきれいに表示させたい。

そのままだと以下のようにすべてゴシック体で表示されてしまう。

f:id:thr3a:20200816102044p:plain

ちなみに今回はdockerの中ということもありrootでしか扱わない前提で話す。

まずはインストール

今回は表示の綺麗さに定評のあるGoogle Noto Fontsを使う。ゴシップ体だけ使うのであればすでにパッケージが出ているので apk add font-noto-cjk で入るが、今回は明朝体もほしいので手動で入れる。最後 fc-cache を実行するのを忘れずに.

RUN wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
    && unzip NotoSansCJKjp-hinted.zip \
    && wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip \
    && unzip -o NotoSerifCJKjp-hinted.zip \
    && mv *.otf /usr/share/fonts/TTF \
    && rm *.zip \
    && fc-cache -f

が、これだけでは明朝体は表示されない。。。

原因

以下のようにCSSで名指しでNoto Fontを書かれている場合はきちんと明朝体で表示できるので、インストール自体はちゃんと出来てるっぽい。

body {
    font-family: 'Noto Serif JP', sans-serif;
}

fc-match コマンドを使うと指定したフォントの時、どのフォントが使われるのか調べられるので試してみる。

# fc-match sans-serif
OpenSans-Regular.ttf: "Open Sans" "Regular"

あれ、Noto Fontくんは??????

どうもアルファベットだけのOpenSansというフォントが優先されてしまって結果的にserif系日本語フォントがないことになってしまいゴシップフォントが表示されてしまってるっぽい。

つまりOpenSansを抹消すればよい(乱暴

rm /usr/share/fonts/TTF/OpenSans*

が、結果は変わらず。。。

# fc-match sans-serif
OpenSans-Regular.ttf: "Open Sans" "Regular"

fontconfigでデフォルトフォントを変更する

結局のところCSSで「serif」を指定しても「Noto Serif CJK JP」が使われないのが悪い。

ってことで明示的に設定してあげる必要がある。

/root/.config/fontconfig に以下を作成し、

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- Default serif fonts -->
 <match target="pattern">
   <test qual="any" name="family"><string>serif</string></test>
   <edit name="family" mode="prepend" binding="same"><string>Noto Serif CJK JP</string></edit>
 </match>
</fontconfig>

確認

# fc-match serif
NotoSerifCJKjp-Regular.otf: "Noto Serif CJK JP" "Regular"

キタ━━━━(゚∀゚)━━━━!!

サイトでも確認してみる。ちゃんと明朝体表示になっている。

f:id:thr3a:20200816103839p:plain

キタ━━━━(゚∀゚)━━━━!!

まとめ

今までをまとめると以下のコマンドになる。

RUN wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
    && unzip NotoSansCJKjp-hinted.zip \
    && wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip \
    && unzip -o NotoSerifCJKjp-hinted.zip \
    && mv *.otf /usr/share/fonts/TTF \
    && rm /usr/share/fonts/TTF/OpenSans* \
    && rm *.zip \
    && mkdir -p /root/.config/fontconfig

ADD docker/fonts.conf /root/.config/fontconfig/fonts.conf
RUN fc-cache -f
  • フォントをインストール
  • 既存のserifフォントを削除
  • fc-cacheを実行

できればserifフォントもapkでインストールできるようになればなぁ。。

参考リンク