PHP5.4へのアップグレードで文字化けしない方法と対策
※当サイトの記事は、プロモーションを含む場合があります。

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’);