URL全体を受け取りマルチバイト文字だけURLエンコードして返す関数(マルチバイト文字はUTF-8前提)。エンコードされてるかどうか不明なユーザー入力URLをエンコードしたい時などに。
function mb_urlencode( $url )
{
$callback = function( $matches )
{
return rawurlencode($matches[0]);
};
return preg_replace_callback('/[^\x21-\x7e]+/', $callback, $url);
}