サーバーのバージョンアップで、PHPの環境に変化!?
数年前にEUC-JPで作成したホームページが急に文字化けしてしまいました。
そこで、調査と対処方法を説明します。
XSERVERのPHPでEUC-JPの文字化け対処 結論
次のphpのコード1行をなるべく先頭の方に入れるこで解決しました。
header("Content-Type:text/html;charset=EUC-JP");
例として対処前と対処後を載せます。
EUC-JPのPHPコード対処前
<?PHP echo "EUC-JPで保存したPHPファイル<br>\n"; echo "あいうえおかきくけこさしすせそたちつてと<br>\n"; ?>
このコードをアクセスすると
こんな感じで文字化けを起こしています。
EUC-JPのPHPコード対処後
PHPファイルの先頭の方にheader()関数のcharsetで使用する文字コードを指定する。
<?PHP header("Content-Type:text/html;charset=EUC-JP"); echo "EUC-JPで保存したPHPファイル<br>\n"; echo "あいうえおかきくけこさしすせそたちつてと<br>\n"; ?>
この対処後のコードをアクセスすると
文字化けは解消されています。
XSERVERのPHPでShift-JISの文字化け対処 結論
次のphpのコード1行をなるべく先頭の方に入れるこで解決しました。
header("Content-Type:text/html;charset=Shift-JIS");
これも例として対処前と対処後を載せます。
Shift-JISのPHPコード対処前
<?PHP echo "Shift-JISで保存したPHPファイル"<br>\n"; echo "あいうえおかきくけこさしすせそたちつてと"<br>\n"; ?>
このコードをアクセスすると
こんな感じで文字化けを起こしています。
Shift-JISのPHPコード対処後
この場合もPHPファイルの先頭の方にheader()関数のcharsetで使用する文字コードを指定する。
<?PHP header("Content-Type:text/html;charset=Shift-JIS"); echo "Shift-JISで保存したPHPファイル"<br>\n"; echo "あいうえおかきくけこさしすせそたちつてと"<br>\n"; ?>
この対処後のコードをアクセスすると
文字化けは起こりません。
XSERVERのPHPで文字化けを起こす原因
実際にホームページがあるXSERVERのフォルダのPHPがどのような設定なのか確認します。
<?PHP phpinfo(); ?>
このソースを文字化けが起きているサーバーのフォルダへphp_info.phpとか言うファイル名でアップロードして
アクセスしてみます。
default_charset が「UTF-8」になってました。
XSERVERのPHPが文字化けを起こす原因
文字コードを「UTF-8」で使用するなら全く問題はないのですが、
それ以外の文字コードを使用すると文字化けを起こすおそれがあります。
XSERVERのPHPが文字化けを起こす対処
そこで通常の対策として「php.ini」を書き換えればよいことです。
ここでXSERVERのマニュアルをよく見ると
「PHP高速化設定(FastCGI)」を有効にしているので、PIPを直接編集しても適用されない!
「php.ini設定」で行うように指示されてます。
そこでXSERVERのサーバーパネルから「php.ini」設定のページを開くと
何と、default_charsetの設定項目が有りません。
default_charsetの変更不可能。
おそらくPHP高速化設定では、個別ドメイン毎の「default_charset」設定は出来ない方針でしょう
取り敢えず
「mbstring.internal_encoding」に使用する文字コードを設定しておきます。
この設定だけでは、やはり文字化けは直りません。
php.ini以外で「default_charset」の設定するには、
.htaccessに次のコードを追加することで変更可能なはずです。
EUC-JPなら
php_value default_charset "EUC-JP"
Shift-JISなら
php_value default_charset "Shift-JIS"
.htaccessで「default_charset」の変更を試みましたが、サーバーエラーではねられてしまいました。
結局、PHP高速化設定中は、ドメイン毎に「default_charset」を変更するという小細工は効かないという結論です。
面倒でも、各PHPのファイルの先頭ではheader()関数で charsetを指定する必要があります。
と言うか、今後UTF-8以外のコードを使用する場合は、必ずheader()関数で charsetを指定する習慣付けをする必要があるみたいです。