初めに
大昔にPHPで作られたWebサイトのローカル開発環境を構築した際、文字コードの周りでちょっと詰まったので解決策を記しておく。
TL;DR
Apacheのconfファイルにphp_value default_charset EUC-JP
を書く
発生した問題
EUC-JPで書かれているコンテンツ(PHP, HTML, CSS, JavaScript等)をApacheというWebサーバーを使って返すサイトのローカル開発環境を、ホスト上に立てた仮想マシン上のDockerコンテナ上に作成した。各システムの概要は以下の通り。
- ホスト:Windows10 Home 20H2
- 仮想マシン
- 仮想化ソフトウェア:VirtualBox 6.1.16
- Box:bento/ubuntu-20.04
- コンテナイメージ:php:7.2-apacheのベースイメージでApacheのrewriteモッドを有効化したもの
開発環境が出来上がり、いざブラウザからアクセスしてみると、ページ上の日本語がすべて文字化けしていた......
原因調査 & 解決
まずブラウザ上でHTMLをどの文字コードで読み込まれているかを確認すると、UTF-8で読み込まれていた。メタタグで<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
を指定しているのになんでUTF-8で読み込まれているのだろうかと色々調べた結果、メタタグでの指定は気休めでしかなく、実際にはファイルの内容やレスポンスヘッダのContent-Type
の指定を見て決められるのだそう。
ファイルの内容はEUC-JPなので(だから文字化けが発生しているわけだが)、原因はContent-Type
の値にあると考えた。Chrome Dev ToolsからHTMLファイルのレスポンスのヘッダを見てみると、案の定Content-Type: text/html; charset=utf-8
になっていた。
Content-Type
を明示的に指定した覚えはないので、ApacheもしくはPHPのデフォルトの設定が効いていると思われたので、調べて出てきたものを一つずつ試した。以下、試した順に記載する。
- Apacheのconfファイルの
AddDefaultCharset UTF-8
をコメントインする、もしくはAddDefaultCharset off
を明示する$^{[1]}$ - php.iniで
default_charset = ""
を指定する$^{[2]}$ - .htaccessで
AddType "text/html;charset=UTF-8" .html
を指定する$^{[3]}$
上記の方法ではレスポンスヘッダがContent-Type: text/html; charset=utf-8
のまま変わらなかった(ほかのケースでは上記の方法のいずれかで解決できる可能性もあると思われる)。
そして、最後に試した以下の方法で解決できた。
- Apacheのconfファイルに
php_value default_charset EUC-JP
を書く
どうやらPHPのデフォルトの設定が悪さをしていたのかな?
なんにせよ無事解決できてよかった。