1
1

More than 3 years have passed since last update.

Apache2 + phpのサイトでEUC-JPのHTMLが文字化けする

Posted at

初めに

大昔に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のデフォルトの設定が効いていると思われたので、調べて出てきたものを一つずつ試した。以下、試した順に記載する。

  1. ApacheのconfファイルのAddDefaultCharset UTF-8をコメントインする、もしくはAddDefaultCharset offを明示する$^{[1]}$
  2. php.iniでdefault_charset = ""を指定する$^{[2]}$
  3. .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のデフォルトの設定が悪さをしていたのかな?
なんにせよ無事解決できてよかった。

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1