PHPでフォームなどのプログラムを作成し、いざサーバーで動作確認をしていると日本語(マルチバイト文字)が「???」のように文字化けすることがあります。PHPでアプリケーションを制作したことのある方であれば一度はこんな経験をされたことがあるはず。そこで今回は、PHPプログラムで日本語が文字化けしたときに確認しておきたいPHPの設定項目をご紹介します。
なぜ 文字化けするのか?
PHPはサーバーサイドで動作するプログラム言語です。フォームを例にたとえると、送信ボタンを押したタイミングで一度フォームの内容がサーバーに送信され、その結果をブラウザが出力します。
ブラウザとサーバーが対話式にキャッチボールをしている、そんなイメージです。そこで大切なのは、双方を共通の文字コードで対話させること。フロントの 文字コードがUTF-8ならばサーバーも UTF-8 で言葉の内容を理解できるように設定しておかないとうまく対話できず、双方の 文字コードのずれが生じると「???」のように文字化けが起こります。
PHPの設定を確認する
文字化けが起こった場合、まずphp.iniと呼ばれるPHPの設定内容を確認します。php.iniを確認するには.phpファイル作成しそのファイルに以下のコードを貼り付けてサーバーへアップロードします。
1 |
<?php phpinfo(); ?> |
上記 ファイルにブラウザからアクセスするとphp.iniの内容が表示されます(下図参照)。その中から mbstringという項目を探し以下2つの項目の設定値を確認します。
・mbstring.encoding_translation ・mbstring.internal_encoding上図では 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に設定します。
特に理由がない限り mbstring.encoding_translation はOffにしておいたほうがよいです。もし mbstring.encoding_translationをOnにしておきたい場合には mbstring.internal_encodingの値をプログラムの文字コードと合わせます。
.htaceessで設定を変更する
以下のコードを .htaceess に貼り付けてサーバーへアップロードします。
1 2 |
php_flag mbstring.encoding_translation off php_value default_charset "UTF-8" |
PHPプログラムにコードを埋め込む
以下のコードを プログラム に貼り付けてサーバーへアップロードします。
1 2 3 |
<?php ini_set('mbstring.internal_encoding' , 'UTF-8'); ?> |
いかがでしたでしょうか?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 | 無効な文字があった場合の代行文字 |