はじめに
このページをご覧ということは、PHPの文字化けにハマってる方かもしれません。
私もハマりましたので、解決策をメモしておきます。
PHPは色んな原因で文字化けするみたいで、調べるだけでも一苦労ですよね。
さて先日、お客様先に、作ったアプリを納品しました。
私は現地に行かず、別の人間が現地に行き、アプリをリリースしてもらいました。
LAMP環境構築にあたり、
インターネットで外に出られない環境だったりで、すったもんだあったそうですが、
大きな問題はなく、無事に作業を終えたようです。
で、その時に聞いた環境が以下の通りでした。
環境
・RedHutLinux Enterprise 7.7
・Apache2.4.6
・PHP 5.7
・MariaDB 5.6
お客様から連絡! 「文字化けしますね」
そんでもってある日、メールを開くと、
「先日のアプリですが、一部文字化けが発生します」とのこと!
状況を聞くと、
DBから値を取得して、テキストボックスに表示する値が、
「ユーザー」などの末尾の伸ばし棒が文字化けするとのこと。
でも、検証環境では一向に再現しないので、どうしたもんかなーと思ってました。
(そもそも検証環境はRedHutLinuxはなく、CentOSやubuntuしかないので、完全な再現が不可だったんですね)
調査
「php 文字化け 原因」などで検索しても、それっぽい情報は一切出ない。。
頑張って実機を動かして調査を進めると、
どうやら、mb_ereg_replace関数を使用している部分が怪しそう。
Google先生に聞いてみると、mb_ereg_replace関数使用での文字化けが発生することがあることがわかりました!
・参考URL
http://fanblogs.jp/itblogger/archive/14/0
なるほど、つまり、文字コードの設定が原因で文字化けが発生することがあるそう。
作ったアプリはUTF-8で動くことを想定していました。
試しに、mb_ereg_replace関数を使用する直前で以下の記述を追加。
mb_regex_encoding( "EUC-JP" );
すると。
・
・
・
文字化けが発生しました!
事象の再現ができました!
こんな感じで文字化けします。
皆さんも、文字化けの内容が同一なら、これが原因かもしれません。
文字化けの原因と対策
つまり、現地で設定したPHPは、EUC-JPがデフォルトの文字コードであることが考えられます。
こちらの検証環境では、UTF-8がデフォルトの文字コードです。
ということで、どうやって現場でのPHPのデフォルト文字コードをUTF-8にしようかと調べたところ。
php.iniで設定ができるみたいですね。
お客様にご連絡して、現場サーバのphp.iniに、以下の2行を追加してもらいました。
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
apacheを再起動して、現場でも文字化けがなくなったとのこと。
めでたしめでたし!!
ただ、以下のサイトを確認すると、このように記載がありました。
mb_regex_encodingのマニュアル
「5.6.0 デフォルトのエンコーディングが EUC-JP から UTF-8 に変わりました。」
現場、PHP5.7て聞いたんですけどね??
そんなこともあるのかー、と思った春の出来事でした。
セキュリティ的にphp5.7でいいのか?とも思ってるんですが、向こうが用意した環境なので、目を瞑ることにしました。。