PHPの文字化けを直す

PHPで書かれたアクセス・カウンターのスクリプトを使っていましたが、ふと気づくと、管理画面で文字化けが起きていました。

このPHPスクリプトは、恐らく、PHP4.xかPHP5.2ぐらいで書かれたものではないかと思いますが、さすがにPHP7.xの現在ではいろいろ不具合が出てしまうようです。

要は、PHPの初期設定で「default_charset」を「UTF-8」に設定されているのが、そもそもの原因です。無料で配布されているほとんどのPHPスクリプトは、Shift_JISの文字コードで出力されるようにできていますが、PHPの初期設定によりShift_JISの文字コードのテキストをUTF-8で出力するため、文字化けが起きるのです。

まあ、そんなことは分かっているのですが、問題はどうやったら直るかです。たぶん、「default_charset」のところを空欄にすれば解決しますが、それができないのが、困ったところで・・・。

問題のサイトを利用しているのは、Hawk Hostと言う海外サーバー会社です。サポートが無能なため、やりとりしていたら、ついに切れました。自分でやるしかありません。基本的にはphp.iniにコードを書いてアップロードします。ところが、後で分かったことですが、ここの共用サーバーでは、php.iniを自分で設置できません。

【重要】Hawk Hostではphp.iniは自分で設置できない

そもそも、PHPのスクリプトも一つではなく、いろいろ設置してあり、文字コードはばらばらです。ユーザーの設定ファイルで文字コードを選択できるスクリプトではすでにUTF-8に切り替えてあるので、問題はありません。しかし、アクセス・カウンターは全部Shift_JISなのです。

Hawk Hostのサポートは、文字コードを変えろと言うので、試しに、文字コードをUTF-8に変えて、スクリプトを保存し直し、HTMLの文字コードもUTF-8に変えてみましたが、文字化けは一部しか直りませんでした。だから、php.iniを触れば簡単なのですが、無能なサポート相手にこれ以上話をしても時間の無駄です。

【重要】自分で文字コードを変えて、PHPのスクリプトを保存し直しても、解決しない。

とにかく、自分で勝手にphp.iniを設置しても、解決しませんでした。これをやる場合は、「default_charset = “Shift_JIS”」とメモ帳やその他のテキストエディターで書いて、「php.ini」のファイル名で保存し、該当のPHPスクリプトのディレクトリーに転送するだけのことですが、これではだめでした。まあ、サーバー会社の設定の問題なので、別のサーバー会社なら、うまく行くかもしれませんので、自己責任でやってみて下さい。

●php.iniを追加することで解決する方法

default_charset = “Shift_JIS”

上記をテキストエディターで書いて、php.iniのファイル名で保存し、該当ディレクトリーへ転送します。今回は、これでは解決しませんでした。

【重要】自分でphp.iniを設置しても解決しない。(Hawk Hostの場合)

そこで、何となくいやだったのですが、.htaccessでPHPの値を設定してやりました。やってみると、これですんなり解決しました。めでたしめでたし。

●.htaccessでPHPの値を設定することで解決する方法

php_value default_charset “Shift_JIS”

・・・と書くだけです。保存して、該当するPHPスクリプトのディレクトリーに転送して、正常になったことを確認して終わりです。

【重要】.htaccessファイルで文字コードを設定すれば解決する。(Hawk Hostの場合)

もちろん、サーバー会社の設定により、これで解決しない場合もあると思いますから、自己責任でいろいろ試して見てください。

おまけ

ついでながら、この作業をやる前に、php.iniの設定がどうなっているのかを確認する方がいいです。方法は、簡単です。

●php.iniの設定内容を確認する方法

<?php phpinfo(); ?>

・・・と書いて、「check.php」など、他のかぶらない適当なファイル名の「.php」のファイルを作り、それを転送し、そのファイルにブラウザーでアクセスすればいいです。ブラウザーの画面に出てきた一覧表の中の「default_charset」のところを検索して探して、どういう設定になっているのか確認します。

さらにおまけ

確認していませんが、PHP5.5ではdefault_charsetが指定されず、空欄になっていましたが、PHP5.6からdefault_charsetがUTF-8に指定されている様です。これがShift_JIS、EUC-JPで文字化けする原因です。

【重要】追記

MultiPHP INI Editorを使う。但し、問題あり。

Hawk HostではcPanelに「MultiPHP INI Editor」があり、この中の「Editor Mode」で出力文字設定やタイムゾーンの設定などができます。但し、ここで設定した内容は「php.ini」だけでなく、「.htaccess」や「.user.ini」にも書き加えられます。これらのファイルがない場合は、新たに作られます。すでにこれらのファイルが存在する場合、そのファイルの文字コードがUTF-8になっていれば問題ありませんが、Shift_JISなどUTF-8以外になっていると、UTF-8の文字列が追加されるので、正常に動作しなくなり、問題が発生する可能性があります。UTF-8の文字列が追加されるのはバグである可能性がありますので、将来、そう言う問題はなくなる可能性があります。

スクリプトごとに設定する

結局、「MultPHP INI Editor」を使えばすっきり解決するわけですが、上記の問題をクリアする必要があります。ただ、今後、スクリプトにより出力文字コードを変えないといけない場合が出てくる可能性がありますので、それを考えると、スクリプトの中に出力文字コードなどの設定を書き込んだ方が後々いいかもしれません。

スクリプトごとに出力文字コードなどの設定を書き込む方法は、下記関連ページのリンクをクリックしてください。

.htaccessでは上手く行かない場合もある

それから、同じHawk Hostのサーバーでも、.htaccessでは上手くいかない場合があることを確認しました。結構ややこしいですね。まあ、試してみるしかありません。

関連ページ:
PHPの文字化けを直す方法

カテゴリーPHP