Eso es problema del servidor web. Desde PHP lo único que puedes hacer es pasar su valor en hexadecimal. Algo así:
Código PHP:
$url = 'http://www.example.com/eñe.html';
$url = preg_replace('|([^A-Za-z0-9._:/-])|e','"%".bin2hex("\1")',$url);
Y ya tienes $url lista para la salida.