現象
Windows では意図通りに生成できた HTML(UTF-8) がLinux (Ubuntu、CentOS) では文字化けする。
再現条件
各 OS で当初の使用ブラウザは以下の通り。
Windows 10 では Chrome を利用している。
こちらは問題なく意図した表示がされる HTML を吐き出す。
Ubuntu 18.04 LTS では Chromium をデフォルトに設定している。
Ubuntu 特有の症状か確認するため、Windows 10 上の仮想マシンへ CentOS 7 をインストールした。
ペンギンたちは両者とも HTML の表示は文字化けしている。
ただし、Firefox では問題なく意図した通りに表示された。
狐につままれたような気持ちだわ。偉いぞ狐。
解決に至るまで
ファイルエンコードがおかしい?
つまらないケアレスミスをしていないか。
保存時にエンコードを Shift_JIS あたりにしていないか。
- 当然 UTF-8 にしてますよねー。
生成時のファイルエンコードがおかしい?
他の言語が同じ場面でどうなるか分からないので、今回はあくまで Python 3.7.0 での話。
違う言語で開発していれば困らないのだろうか。
しかし別章で示すけど、JavaScript と PHP(2014年なので ES2015 や PHP 7 以前の時代だろうか)も同じ現象があったみたい?
ファイル生成時にやらかしているかもしれない。
ファイルの読み書き時にエンコードを指定できるので、保存時に何かやらかしている可能性に賭けて一応エンコードを弄る。
- そもそも Python 3 系はデフォルトで UTF-8 だよなぁ。
Linux だと入出力が変わる?
sys
やio
を import して標準入出力を弄ろうとしたり、localeの設定を変えたり。
$ echo $LANG
ja_JP.UTF-8
変更してもどうにもならないっすね……。
様々なサイトを読んでいると、Linux で皆さん同じようなことで苦労しておられるようで。
どうにかしてくれ。
解決策
生成ファイルをブラウザ上で確認したいなら、一行目に <meta charset="UTF-8">
を書くだけで読めますね。
HTML4 なら<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
で指定していたみたいね。
これに気づくまでに3時間……。
自分の場合は生成ファイルをテンプレートエンジンに埋め込むため、テンプレートエンジンが UTF-8 に設定されていれば期待通りの表示がされてくれると祈祷している。
祈りが通じなかったら追記します。