PHPで作成したページで、Auの携帯電話からPOSTで文字を送ると、文字化けを起こしてしまいます。
docomoやsoftbankでは正常に表示されるのですが、Auでは
”%A5%C7%A5\0”
のように表示されてしまいます。
これは、Au独自の2つの問題によって発生することがあります。
1.POSTで送信されたデータの末尾に「\0」をつける
2.文字コードが「ASCII」で送信される。
Auでは、独自の変換モジュールを介してhtmlを表示するようで、文字コードをしっかりと指定しなければ表示されないことがあるそうです。今回は、文字コードをShift_JISで指定した場合にも発生した事象についてまとめました。
※デフォルトはShift_JISのページでテストしました。
※テストでは、AuのCA001を使用しています。
1.の問題は、stripslashes関数で\
(バックスラッシュ)部を変換することで解決します。
$text = stripslashes($_POST["text"]);
これにより、文字列は”%A5%C7%A5\n”→”%A5%C7%A5”となります。
また、数字「0」や、チェックボックス「on」なども、「0\0」や「on\0」と入力されるので、stripslashes関数で変換をする必要があります。
2.の問題は、urldecode関数でエンコードされた文字を元に戻し解決します。
$text = urldecode($text);
AuではTEXTをASCIIにエンコードし送るため、受信側でShift_JISにデコードしなければなりません。
※エンコードされていない文字列をデコードしても、文字化けは起こらないようです。
1、2を組み合わせると、
$text = urldecode(stripslashes($_POST["text"]));
これにより、”%A5%C7%A5\0”→”テスト”に変換されました。
※この内容に間違いがあっても、責任は負いかねます。