URL形式のストリームフィルタで文字コード変換ができない

以前、ストリームフィルタで文字コード変換してみるというエントリを書いたんだけど、今回別の方法でフィルタを使おうと思ったらハマったのでメモ。


前回はstream_filter_prepend/append関数でストリームのリソース(ハンドル)に対してフィルタを追加したんだけど、fopen wrapperでも次のようにしてフィルタが適用できるようなので試してみた。

<?php
$file = $argv[1];
readfile('php://filter/read=convert.base64-encode/resource=' . $file);
?>

こんな感じでファイル名を引数にとって一気に処理してくれるタイプの関数でもフィルタが使える。
(全然関係ないけど、PHPタグが入ってないとハイライトされないのが不便。理由はわかるけどさぁ。)


勘のいい人は気付いただろうし、そうでない人も前のエントリを見ればわかると思うが、iconvで文字コードを変換するフィルタはこんな感じで指定することになるので……

convert.iconv.from_enc/to_enc

これを上記のコードに適用すると……あれ、スラッシュまずくね?
だめだよなぁと思いつつも'/'のまま書いてみる……ダメ。
じゃあURLエンコードしてみる……ダメ。
フィルタの部分だけクォートで括ってみるといういい加減なこともしてみる……ダメ。
実はカンマ区切りとか別の書き方もサポートされて……ない。


オワタ\(^o^)/


実際、php-5.2.8のソースを見る限りではURLデコードするようなコードも、'/'以外の区切り文字をサポートするようなコードも書かれてはいない。


色々ググってたらバグレポートに同様の問題のポストがあって、CVS上ではフィルタ名をURLデコードするように修正されているらしい。
しかし2008年8月にクローズされてるのに、未だに反映されてないのはなんでだ? と思ったら、レポートの対象バージョンが5.3だった罠。
5.3.0beta1のソースには確かに反映されていたけど、5.2.9RC1のソースには反映されていなかった……。


いやまぁ、別に困ることはないんだけどね。