15 June 2008

PHP basenameの日本語非対応

PHPのbasename関数が日本語に対応していない…
開発元でもバグと認めているようで、自己解決以外に方法はなさそう。


$filename = basename('c:/some folder/新規テキスト ドキュメント.txt');

この関数は、'V規テキスト ドキュメント.txt' を返す。

自己解決方法として、


$arrBasename = explode('/', 'c:/some folder/新規テキスト ドキュメント.txt');
$filename = $arrBasename[count($arrBasename)-1];

開発元がこのバグを修正しないと言うことは、日本語対応してしまうと、他の言語で影響があると言うことなのだろう。 つまり、将来に渡って baename 関数が使えないか、他の言語の互換性問題を発生させてまでも日本のユーザに便宜を図ってくれるのか… と言うところだろうか。

開発元は、「Won't fix in PHP 5. This will be implemented for PHP 6.」と言っているので、6で直るのかなぁ。


余談

この現象が起きた時に、これは文字のエンコード問題だ(Shift JISの互換性問題だ)と思い、次のようなムチャクチャなコードを試してみた。


$filename = mb_convert_encoding(basename(mb_convert_encoding('c:/some folder/新規テキスト ドキュメント.txt', 'UTF-8', 'auto')), 'SJIS', 'UTF-8');

その結果は、$filename = ' ドキュメント.txt'    orz ...