PHPでShift_JISのフォームが文字化けする現象に対処。
ホームページ制作でPHPフォームは様々な場面で使用します。
当然サーバーもその都度異なるため、PHPフォームが思うように動作しないことも多々あります。
今回、Shift_JISでフォームを組み、PHPの文字コードをShift_JISに設定し、表示出力は問題ないのですが、フォームで入力した文字だけ文字化けする現象が発生しました。
色々調べて解決できましたので、忘備録として記録いたします。
現象はこのような感じです。
Shift_JISで組み込んだフォームに、文字を入力して送信したところ、入力内容が文字化けしました。
謎:PHP文字コードはShift_JISに設定し、文字出力も文字化けしないのに、フォームだけなぜ文字化けするのか?
大抵Shift_JISであることが原因なのですが、文字コード(default_charset)をShift_JISにし、文字化けしないように設定しています。
事実、DBからの文字出力等は文字化けしていません。
ではなぜ、フォームから入力した文字だけ、文字化けしてしまったのでしょうか?
いろいろググって調べて試して、原因にたどり着きました。
原因は入力文字エンコード設定の文字コードが異なっていました
現象の発生するプログラムを別のサーバーで試してみたところ、現象が発生しませんでした。
つまり、サーバーの設定に要因があるということです。
そこでサーバーの設定を調べてみたところ、原因が判明しました。
一見わかりにくいですが、見るべき設定は以下の2つです。
- mbstring.encoding_translation(文字変換処理を使うかどうか)
- mbstring.internal_encoding(文字変換する場合の文字コード)
サーバーには、フォームなどで入力された文字コードを、別の文字コードに変換する機能があります。いわゆるエンコードです。
今回の事例だと、PHPの文字コードはShift_JISに設定されていましたが、文字変換時に使用される文字コードは「UTF-8」になっていました。
だから、フォーム入力のみ文字化けしていました。
対処方法:次のように設定して解決しました。
原因は、フォームからの入力文字を別の文字コードに変換していたため、文字化け現象が発生していました。
ならば文字コード変換を行わなければよいのです。
変換をするかしないかの設定は、「mbstring.encoding_translation」でおこなわれます。
これを以下のようにOFFに設定しました。
変換文字コードはUTF-8のままですが、変換処理自体をOFFにし、変換処理自体が行われないようにしました。
結果、文字化けは発生しなくなりました。
フォームからの入力が文字化けしなくなりました。
具体的な設定方法について解説します
理屈は、変換処理をやらなければOKということです。
では、具体的にどのように設定すればよいのでしょうか?
レンタルサーバーの場合は、直接設定ができない場合が多いです。
実際に設定した方法を解説します。
.htaccessで設定する記述方法
php.iniが設定できないサーバーでも、.htaccessならば設定できる場合があります。その場合は、.htaccessに以下のように記載いたします。
1 |
php_flag mbstring.encoding_translation Off |
php.iniで設定する記述方法
さくらサーバー等では、.htaccessにphp関連の設定はできませんが、php.iniファイルを追加で記述することができます。
この場合は、以下のように記述いたします。
1 |
mbstring.encoding_translation = Off |
変換文字コード自体を修正する方法
変換処理はOFFにせず、変換文字コードを変える方法もあります。
その場合は、以下のように記述します。
※今回はShift_JISに設定する例を記述します。
■.htaccess記述例
1 |
php_value mbstring.internal_encoding SJIS |
■php.ini記述例
1 |
mbstring.internal_encoding = SJIS |
PHPの文字化け原因は山のようにありますが、大抵何とかなるものです。
私も今まで、さまざまな文字化け現象を見てきました。
MYSQLの文字コードによる要因、サーバーに設定されている文字コードの要因、プログラムを記述している文字コードの要因などです。
文字化け現象は、見た目は同じですが、原因は多岐にわたります。
そのため、どこに問題があるのかを見極めないとなかなか解決できません。
今回私は原因を調べるために、色んな値を調べ、$_REQUEST(フォームからの入力内容が保存されている場所)の中身が文字化けしていたことで、サーバー設定要因だと気づきました。
文字化けとは地道な調査で解決できるものです。