やっぱりphpは変: parse_str編

phpにはparse_strという関数がある。
http://jp.php.net/parse_str

フォームから送信されたデータを連想配列に変換するためのものだが、
フォームから送信されていなくても、同じ形式の文字列を分解するのに使える。

でも、落とし穴。

.htaccess等で以下のような設定(PHPのデフォルト?)になっているとして、

php_flag  mbstring.encoding_translation on
php_value mbstring.http_input auto
php_value mbstring.internal_encoding UTF-8

EUC-JPで以下のようなコードを書いたとして、

$string = "今日=雨&明日=晴れ";  // EUC-JP
parse_str($string, $hash);
print_r($hash);  // UTF-8

これを実行すると、なんと、UTF-8の文字列が出てくるのだ。(PHP 5.1.6あたりで確認)

もともとphpの内部処理のために存在したルーチンをユーザ向けに提供しているのだろうか、mbstringのencoding translationとかmagic_quotes_gpcとかの処理が内部で必ず実行されてしまう。

ということで、便利な関数を使うときは、それなりの覚悟が必要かも。

ちなみに、parse_strの逆は、http_build_queryである。
http://jp.php.net/http_build_query