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-8SJISと解釈され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