未分類

Docker+gtkmmでlocaleを設定したのに日本語の文字化けが直らなかった原因

原因

日本語フォントがインストールされていなかったことでした。

解決方法

日本語フォントをインストールしましょう。

一例

# コンテナ内

$ fc-list
(インストール済みフォント一覧)
(日本語フォントが無い)

$ apt install fonts-takao

$ fc-list
/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf: Takaoゴシック,TakaoGothic:style=Regular
/usr/share/fonts/truetype/takao-mincho/TakaoMincho.ttf: Takao明朝,TakaoMincho:style=Regular
などの行が増えていればOK

Dockerfileであれば以下を追加します。

RUN apt-get -y install fonts-takao

経緯

Docker環境(イメージはubuntu:20.04)でgtkmmを用いてLinuxのGUIアプリを作成し、コンテナ内で起動させたものをsocket経由でhost側に表示したところ、日本語が文字化けしました。

(process:000) Gtk-WARNING **: 00:00:00.000: Locale not supported by C library.
        Using the fallback 'C' locale.

上記warningが出ており、localeの設定を行いました。

具体的にはDockerfileに以下の2行を追加しました。

ENV LANG ja_JP.UTF-8
RUN apt-get -y install language-pack-ja

これによりwarningは消えましたが、文字化けは直っていません。

なおこの時点でコンソール上やwindowタイトル部には日本語が問題なく表示されていました。

GUIアプリ内の日本語のみが文字化けしている状態です。

また、実行ファイルをhost側から直接起動すると、文字化けしません。

ゆえにGlib::ustring型関連で文字化けしているわけではないことが分かります。

さらに調べていく中で、日本語フォントが入っていない可能性に気づきました。

(一度気づいてしまうと、いくら日本語を使いたいと設定しても肝心の日本語フォントがなければ表示できないのは当たり前なんですけどね(汗))

上記「解決方法」のように日本語フォントを追加したところ、文字化けは解消しました。

matplotlibなんかでも同じことが言えそうです。(未確認)