PHPユーザーの方でPHP5.4へアップグレード、あるいはダウングレードしなければならない方へ情報共有致します。
私は2014年頃の話ですが、windows8.1のパソコン購入に伴い、PHPをアップグレードしてPHP5.4をインストールしなければなりませんでした。また、レンタルサーバーのhetemlでPHP5.3またはPHP5.4へ、当時半ば強制的にでアップグレードされてしまいました。実にいろいろと対応に追われました。
そこで、PHPアップグレードに際して文字化けに遭遇したのですが、なんとか切り抜けることができましたので、そのとき役にたった文字化けの回避方法をお伝えします。
phpのアップグレードによる文字化け対策は、php.ini、またはソースを変更する
まず、PHP5.4へのアップグレード、あるいはダウングレードで文字化けの問題に遭遇した場合、まずは一通り、ソースを見直して、文字コードを指定してないところを指定するなど、基本的なことは初めにやることは当然な話です。
しかし、それでもなかなか解決しないことがあります。それでもだめな場合の解決方法として、一番初めにお勧めする対処法としては、php.iniで文字コードを設定することがベストと思っています。
そこで、php.iniをいじくれるかどうかで説明を場合分けします。
※この記事は2022年5月に更新しています。
php.iniをいじくれる場合のとき
mbstring.internal_encodingの設定
php.iniでmbstring.internal_encodingを設定します。
(デフォルトではセミコロンでコメントアウトされていますので、それを外して記述します)
mbstring.internal_encoding = ‘文字コード’
たとえば、EUC-JPにしたいなら以下のように記述します。
mbstring.internal_encoding = EUC-JP
mbstring.detect_orderの設定
上記のmbstring.internal_encodingを設定して、それでもなお文字化けするならmbstring.detect_orderの項目を設定します。
これは、優先順位が高い文字コード順に設定できるものです。
以下の例では、EUC-JP、UTF-8、SJIS、JIS、ASCIIの順に設定しています。
mbstring.detect_order = EUC-JP,UTF-8,SJIS,JIS,ASCII
php.iniをいじくれない場合のとき
レンタルサーバー等の環境によって、php.iniをいじくれない場合があります。
また、php.iniを設定してもうまく反映されない場合があります。
人によっては、「php.iniを編集するの面倒」という人もいるでしょう。
そのときは、phpのソースに直接以下の内容を記述をします。
mb_internal_encodingを使う
PHPのソース内で上部に以下のコードを追加します。
mb_internal_encoding(“文字コード”);
たとえば、EUC-JPの場合は以下のようになります。
mb_internal_encoding(“EUC-JP”);
headerでcharsetを宣言する
mb_internal_encodingで文字化けが解消しないならheaderでcharsetを宣言します。
PHPのソース内の一番はじめに以下のコードを追加するだけです。
header(“Content-Type: text/html; charset=文字コード”);
たとえば、EUC-JPの場合は以下のようになります。
header(“Content-Type: text/html; charset=EUC-JP”);
php.iniをいじくれるかどうかにかかわらず気を付けるべき点
mb_eregを使用している場合は注意が必要
PHP内でmb_eregを使用していると、たとえ内部エンコーディングが設定されていたとしても、それとは別の設定によってmb_eregの文字コードが決定されてしまいます。
おまけにデバッグしていて「非常に気づきにくい」といった点が特徴です。
mb_eregの文字コードの設定方法
mb_eregの文字コードは以下のように設定します。
mb_regex_encoding(‘文字コード’);
EUC-JPの場合は以下の通りです。
mb_regex_encoding(‘EUC-JP’);