ローカル環境でバーチャルホストごとに文字コードを指定する
久々に文字化けにつまずきました。
対応していたのは既存サイトの改修案件。 いつも通り、まずはMAMPでローカルサーバーを立ててサイト全体を確認したところ、全ページ文字化けしていました。
原因を調べる
まずは文字化けの原因を探るべく、HTML内の文字コード指定を確認。
head内を確認してみると、HTML4.01でmeta-charsetにはshift_jisの指定が。(今はUTF-8を使用するのが主流ですが、古いサイトだったりフォームが絡んでいたりするとたまに遭遇しますね)
今回は既存のサイトをいじるので、トラブルを避けるためにもサイト全体の文字コードを変更するなんてことはしない方が良さそう。
ということで自分のローカル環境をSHIFT-JISに対応させることにしました。
MAMPの文字コードを変更する
日本語版MAMPでは、デフォルトの文字コードがUTF-8ではないのだそう。
php.iniを編集して、設定を変更してみます。
macの場合は以下に存在するファイルです。
アプリケーション/MAMP/bin/php/php7.1.6/conf/php.ini
※ 利用中のPHPのバージョンを選択。
394行目付近
;default_charset = "iso-8859-1" //↓セミコロンを削除し書き換える default_charset = "SHIFT-JIS"
1018行目付近
;mbstring.language = Japanese //↓セミコロンを削除 mbstring.language = Japanese
1023行目付近
;mbstring.internal_encoding = EUC-JP //↓セミコロンを削除しUTF-8へ書き換える mbstring.internal_encoding = SHIFT-JIS
1026行目付近
;mbstring.http_input = auto //↓セミコロンを削除 mbstring.http_input = auto
1041行目付近
;mbstring.detect_order = UTF-8,SJIS,EUR-JP,JIS,ASCII //↓セミコロンを削除 mbstring.detect_order = UTF-8,SJIS,EUR-JP,JIS,ASCII
変更後、MAMPを再起動して表示を確認します。
これはなぜなのか結局わからなかったのですが、この時点では私の環境ではまだ文字化けが直っていませんでした。
しかも、この方法だとMAMP自体の文字コードを変えてしまっているので、他のバーチャルホスト内のデータもSHIFT-JISになってしまっているはず。
作業するたび毎回php.iniファイルを編集して文字コードを切り替えるのは効率が悪い。
バーチャルホストごとに文字コードを切り替える
ということで本題。バーチャルホストごとに個別で文字コードを指定する方法を調べてみました。
バーチャルホストの設定をしている以下のファイルに、直接文字コードを指定すれば良いそうです。 /etc/httpd/conf.d/vhosts.conf
<VirtualHost *:80> DocumentRoot "/var/www/html/xxxx" AddDefaultCharset shift_jis </VirtualHost>
この設定を反映するために、先ほどのphp.iniファイルに記述されているMAMPの文字コードの指定は空の状態にしておきます。
;default_charset = "UTF-8" default_charset = ""
これでやっと文字化けが解消されました!
↓ 参考にさせていただいたサイト