UTF-8な日本語文字列をURLエンコードしてPHPに渡すと文字化けする問題
時間が無くてあんまりまとまってないので読みにくかったり分かりにくかったりしたらゴメン
ごくごく簡単にHTTP GETで文字列を渡す場合、PHPでは下記のようなコードで簡単に受け取れる。
・・・が、UTF-8な日本語文字列をURLエンコードしてPHPに渡すと文字化けする場合がある
たとえば、「%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8」=「メッセージ」とか・・・
if ( isset($_GET['str']) ){ printf("GET: %s\n", $_GET['str']); }
上の方法だとURLエンコードを勝手にデコードされて壊れたUTF-8のエンコードでプリントされる。
下のようにするとgetenvの部分まではデコードされず、parse_strの部分できちんとURLデコードされ、その上で文字コードをUTF-8→SJISと解釈されSJISのエンコードでプリントされる
parse_str(getenv('QUERY_STRING')); if ( isset($str) ){ printf("QUERY_STRING: %s\n", $str); }
また、下記のようにしてSJISからUTF-8のエンコードに変更しようとすると$_GETを使った時と同様の壊れたUTF-8な日本語を出力する。
parse_str(getenv('QUERY_STRING')); if ( isset($str) ){ printf("QUERY_STRING: %s\n", mb_convert_encoding($str,"UTF-8","SJIS")); }
したがって、おそらくこの問題の原因は mb_convert_encoding が腐ってると言うことになりそうだ・・・
原因は分かったが、どうやってUTF-8にエンコードし直すべきか・・・orz
追記:
嘘だった・・・
調べてみたら読み込んでいるモジュールで事前に$_GETに対して変な変換をかましてた・・・
・・・それは気がつかねーよ・・・orz