言語(PHP他)PHP
更新日 : 2020年9月1日
投稿日 : 2017年3月02日

PHPでPOSTすると文字化けする原因2つ

PHPでPOSTすると文字化けする原因2つの画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして7年~の経験があります。WordPressは2年半~の経験があります。その他、jQuery、HTML、CSSも使用します。
ここでは主に過去に納品した案件や自サイト運営(エンジニア婦人ノート)で遭遇したことについて書いています。

Webで動くものを作っていて、欠かせない処理が「POST」。ユーザー登録やお問い合わせで日々使うものですね。

一見基本で簡単なようですが、これには大きな落とし穴が潜んでいることも…。

もしちゃんと作ったのに、環境によって動かない、正しい内容で送信されない!といったときには「自動エンコーティング設定」と「formのenctype」を疑ってみてください。

POST送信すると文字化けする

これは自分のローカル環境で作ったフォームが、テストしても特に問題なくPOSTできたのに、稼働中のサーバーにあげたらできなくなった、という話です。

POSTしたものが文字化けしてしまいました。

「自動エンコーティング」の設定

php.iniの設定で、「mbstring.encoding_translation」が「on」になっていると、自動でエンコーディング変換が走ります。

単純な話、これを「off」にしてやれば解決ですが、他人様のサーバーだから勝手にいじれるわけもありません…

他にもこの現象に嵌った方はいるようです。

mbstring.encoding_translation 邪魔なだけ、と思うのは私だけなのか?|ぼらこみゅ

すごい状況下もあるものです…

ただ、内部文字エンコードはUTF-8だったので、完全に上記の例に当てはまっていたわけではありませんでした。

じゃあ一体なんなのか?と更に調べていきます…

※php.iniはphpinfo();を書いたPHPファイルを確認したいサーバーに置いて、ブラウザで実行するとその内容を見れるようになります。

最終的な解決の糸口

enctype=”multipart/form-data”を指定するとHTTP入力の自動エンコーディング変換で失敗してしまう

PHPのマルチバイトにおけるトラブルシューティング

私が陥ったケースでは、画像等の添付送信がないのにこの記述をしていました。そのため、この記述を削除して解決しました。

画像などの添付送信もないのになんでenctype=”multipart/form-data”なんて書いていたのよ、と言いますと、このときはWordPressプラグインによるフォーム機能を使っていたので自分で記述していたわけではなく、プログラム側で自動生成する際にこの記述が必ず入るようになっていました。

ちなみに上記サイトではonにしておきましょう、っていう感じですが、最近は「mbstring.encoding_translation」の設定はoffにしておきましょうっていう流れのようですね。

だって文字コードが自動変換かけられたらこっちはたまらないよ…こっちではどうにもならないってことでしょう?

まとめ

  • フォームが環境によって正常に動かないときは、サーバーの自動エンコーディング設定を疑ってみよう
  • formのenctypeが要望に一致したものになっているか、確認しよう

開発環境では動いていたのに、本番環境に適用したらうまくいかない、というのはよくある話です。もし遭遇してしまったら、サーバーの環境やソースに不要な記述をしていないかを確認してみてください。