システム開発 /

PHPプログラムで日本語が文字化けした時の対処法

PHPでフォームなどのプログラムを作成し、いざサーバーで動作確認をしていると日本語(マルチバイト文字)が「???」のように文字化けすることがあります。PHPでアプリケーションを制作したことのある方であれば一度はこんな経験をされたことがあるはず。そこで今回は、PHPプログラムで日本語が文字化けしたときに確認しておきたいPHPの設定項目をご紹介します。

02

なぜ 文字化けするのか?

PHPはサーバーサイドで動作するプログラム言語です。フォームを例にたとえると、送信ボタンを押したタイミングで一度フォームの内容がサーバーに送信され、その結果をブラウザが出力します。

ブラウザとサーバーが対話式にキャッチボールをしている、そんなイメージです。そこで大切なのは、双方を共通の文字コードで対話させること。フロントの 文字コードがUTF-8ならばサーバーも UTF-8 で言葉の内容を理解できるように設定しておかないとうまく対話できず、双方の 文字コードのずれが生じると「???」のように文字化けが起こります。

PHPの設定を確認する

文字化けが起こった場合、まずphp.iniと呼ばれるPHPの設定内容を確認します。php.iniを確認するには.phpファイル作成しそのファイルに以下のコードを貼り付けてサーバーへアップロードします。

上記 ファイルにブラウザからアクセスするとphp.iniの内容が表示されます(下図参照)。その中から  mbstringという項目を探し以下2つの項目の設定値を確認します。

・mbstring.encoding_translation ・mbstring.internal_encoding 0506

上図では mbstring.encoding_translation = On 、 mbstring.internal_encoding = EUC-JP に設定されています。

これはmbstring.encoding_translation がOnの場合、サーバー内部でフロントエンドから送信された「あいうえお」など日本語の値をEUC-JP( mbstring.internal_encoding ) として内部処理し、ブラウザに値を返していることになります。もしプログラムをUTF-8で作っていたならば、今のPHPの設定では確実に文字化けが起こるので、 PHPの設定を変更する必要があります。

PHPの設定を変更する

今時のレンタルサーバーであれば、ほとんどの場合コントロールパネルからphp.iniの変更が可能です。下図はヘテムルのレンタルサーバーで php.ini を変更する場合の画面キャプチャです。
mbstring.encoding_translation をOffに設定します。

07

特に理由がない限り mbstring.encoding_translation はOffにしておいたほうがよいです。もし mbstring.encoding_translationをOnにしておきたい場合には mbstring.internal_encodingの値をプログラムの文字コードと合わせます。

08
レンタルサーバーによっては コントロールパネルから php.ini  の変更ができない場合もあるかもしれません。そのようなときは以下の方法をお試しください。

.htaceessで設定を変更する

以下のコードを .htaceess に貼り付けてサーバーへアップロードします。

PHPプログラムにコードを埋め込む

以下のコードを プログラム に貼り付けてサーバーへアップロードします。 ※ ini_set関数では mbstring.encoding_translationの変更はできません。

いかがでしたでしょうか?PHPで作成したフォームで文字化けがおこると「書いたソースに問題があるのではないか?」といった具合にプログラマ目線でソースコードを疑いがちですが、PHPの文字コードの設定については レンタルサーバー ごとにルールが異なります。文字化けが起こったときはまずPHPの設定を疑ってみると早期に問題が解決できるかもしれません。 mbstringの設定について以下の表にまとめましたのでこちらもご参照ください。

mbstring.detect_order UTF-8,EUC-JP,SJIS などの文字コード検出順位
mbstring.encoding_translation 内部文字エンコーディングへの変換
mbstring.func_overload mail()やstr()関数をmb_系関数に書き換える
mbstring.http_input HTTP入力の「全自動」エンコーディング変換
mbstring.http_output HTTP出力の「全自動」エンコーディング変換
mbstring.http_output_conv_mimetypes Content-Typeの正規表現パターンを指定
mbstring.internal_encoding 内部文字コードの設定
mbstring.language 使用される言語設定
mbstring.strict_detection 厳密なエンコーディング検出
mbstring.substitute_character 無効な文字があった場合の代行文字

この記事を書いた人

堀孝文

PAGE TOP