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に以下のように記載いたします。

php.iniで設定する記述方法

さくらサーバー等では、.htaccessにphp関連の設定はできませんが、php.iniファイルを追加で記述することができます。

この場合は、以下のように記述いたします。

変換文字コード自体を修正する方法

変換処理はOFFにせず、変換文字コードを変える方法もあります。
その場合は、以下のように記述します。
※今回はShift_JISに設定する例を記述します。

■.htaccess記述例

■php.ini記述例

PHPの文字化け原因は山のようにありますが、大抵何とかなるものです。

私も今まで、さまざまな文字化け現象を見てきました。
MYSQLの文字コードによる要因、サーバーに設定されている文字コードの要因、プログラムを記述している文字コードの要因などです。

文字化け現象は、見た目は同じですが、原因は多岐にわたります。
そのため、どこに問題があるのかを見極めないとなかなか解決できません。

今回私は原因を調べるために、色んな値を調べ、$_REQUEST(フォームからの入力内容が保存されている場所)の中身が文字化けしていたことで、サーバー設定要因だと気づきました。

文字化けとは地道な調査で解決できるものです。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております