ホームページ制作 オフィスオバタ

PHPでShift_JISのフォームが文字化けする現象に対処。

ホームページ制作でPHPフォームは様々な場面で使用します。
当然サーバーもその都度異なるため、PHPフォームが思うように動作しないことも多々あります。

今回、Shift_JISでフォームを組み、PHPの文字コードをShift_JISに設定し、表示出力は問題ないのですが、フォームで入力した文字だけ文字化けする現象が発生しました。

色々調べて解決できましたので、忘備録として記録いたします。

現象はこのような感じです。

Shift_JISで組み込んだフォームに、文字を入力して送信したところ、入力内容が文字化けしました。

謎:PHP文字コードはShift_JISに設定し、文字出力も文字化けしないのに、フォームだけなぜ文字化けするのか?

大抵Shift_JISであることが原因なのですが、文字コード(default_charset)をShift_JISにし、文字化けしないように設定しています。

事実、DBからの文字出力等は文字化けしていません。
ではなぜ、フォームから入力した文字だけ、文字化けしてしまったのでしょうか?

いろいろググって調べて試して、原因にたどり着きました。

原因は入力文字エンコード設定の文字コードが異なっていました

現象の発生するプログラムを別のサーバーで試してみたところ、現象が発生しませんでした。

つまり、サーバーの設定に要因があるということです。

そこでサーバーの設定を調べてみたところ、原因が判明しました。

一見わかりにくいですが、見るべき設定は以下の2つです。

サーバーには、フォームなどで入力された文字コードを、別の文字コードに変換する機能があります。いわゆるエンコードです。

今回の事例だと、PHPの文字コードはShift_JISに設定されていましたが、文字変換時に使用される文字コードは「UTF-8」になっていました。

だから、フォーム入力のみ文字化けしていました。

対処方法:次のように設定して解決しました。

原因は、フォームからの入力文字を別の文字コードに変換していたため、文字化け現象が発生していました。

ならば文字コード変換を行わなければよいのです。
変換をするかしないかの設定は、「mbstring.encoding_translation」でおこなわれます。

これを以下のようにOFFに設定しました。

変換文字コードはUTF-8のままですが、変換処理自体をOFFにし、変換処理自体が行われないようにしました。

結果、文字化けは発生しなくなりました。

フォームからの入力が文字化けしなくなりました。

具体的な設定方法について解説します

理屈は、変換処理をやらなければOKということです。
では、具体的にどのように設定すればよいのでしょうか?

レンタルサーバーの場合は、直接設定ができない場合が多いです。
実際に設定した方法を解説します。

.htaccessで設定する記述方法

php.iniが設定できないサーバーでも、.htaccessならば設定できる場合があります。その場合は、.htaccessに以下のように記載いたします。

php_flag mbstring.encoding_translation Off

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

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

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

mbstring.encoding_translation = Off

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

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

■.htaccess記述例

php_value mbstring.internal_encoding SJIS

■php.ini記述例

mbstring.internal_encoding = SJIS

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

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

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

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

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

モバイルバージョンを終了