PHPのフォーム入力が文字化けする原因とUTF-8対応
掲載日:
更新日:
INFORMATION > PHPのフォーム入力が文字化けする原因とUTF-8対応
結論:文字化けは受信後の自動変換だけで直すのではなく、HTTPのContent-Type、HTML、PHP、保存先までUTF-8を一貫させ、どの境界で文字列が変わったか確認します。
この記事の対象と位置付け:本文は古いPHP環境で、画面遷移後の入力値が文字化けした事例を調べた記録です。原因を観察する手順は参考になりますが、掲載設定を現行PHPへそのまま適用しないでください。
【重要:2026年時点の注意】mbstring.http_inputとmbstring.internal_encodingはPHP 5.6から非推奨です。mbstring.encoding_translationによるHTTP入力の自動変換はデータを意図せず変える可能性があります。現行PHPではdefault_charsetと明示的な入出力・DB接続の文字コードを整合させてください。
公式情報:PHP 5.6で非推奨になった設定、PHPのdefault_charset、mbstringのHTTP入出力変換
概要
PHPで入力画面から確認画面へ遷移した時に文字化けが発生しました。
フォームに文字を入力し、確認画面へ遷移すると文字化けが発生。入力チェックエラーにより自画面遷移する場合も文字化けが発生。 サーバ構築したてだったので、何かPHPの設定が漏れている気がしたので、その時に調べた内容を記載します。
【入力画面】
【確認画面】
目次
- 原因調査
- 1-1. 画面に表示されるまでの流れの整理
- 1-2. 調査
- まとめ
1. 原因調査
原因調査のため調べた内容は以下の通りです。
1-1. 画面に表示されるまでの流れの整理
画面に表示される流れについてです。
言語問わずですが、文字化けしている場合はどこで文字化けが発生しているか調べるところから実施します。 処理フローとしては、以下の図の通りです。
1-2. 調査
①~⑤までは、文字化けに関係ないので(そもそもまだ入力前なので)問題は⑥~⑪のいずれか。 怪しいのは、⑨のApacheと⑩のPHPでしたが、PHPの処理から解析を開始しました。
まず、PHPの設定(php.ini)を確認。
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
上記の通りになっており、見た感じ問題なさそう。となると問題はPHPのソースが原因の様、しかし、PHPのソースを見ても問題がありそうな個所を特定できず。。。
もう一度、php.iniに怪しい設定がないか確認したところ、一か所怪しげな設定がありました。
mbstring.http_input = auto
autoとなっているのでUTF-8でエンコードされているかが不明だったので、試しに下記の通りに変更。
mbstring.http_input = UTF-8
無事文字化け解消。この設定はPHPで日本語などのマルチバイト文字列を使う際に必要なmbstringモジュールの設定。受信したhttpリクエストをエンコーディングする設定。
1-2. まとめ
文字化けが発生した際は、まずは処理フローの整理をしてみてください。 そして、PHPで入力画面から確認画面などの画面遷移する際に、文字化けをする場合はphp.iniの以下の設定を疑ってみてください。 初期設定は「auto」になっているので、mbstringを使って日本語(マルチバイト文字列)を処理する際は確認してみてください。
最後までご覧いただきありがとうございました。


