La función urlencode() y rawurlencode() es la que genera un URL de esas características .. para "codificar" un URL de forma standard.
La primera (urlencode()) genera nu %n° para ciertos códigos como espacios (%20 creo recordar), caracteres acentuados .. etc.
La segunda (rawurlencode()) genera un + ante un espacio.
(o era al reves? .. ahora no recuerdo bien)
Todo eso lo define "legalmente" la RFC 1738 según indica el manual oficial de PHP.
http://www.faqs.org/rfcs/rfc1738
Puedes ver muchos comentarios al respecto en:
http://www.php.net/manual/en/function.rawurlencode.php http://www.php.net/manual/en/function.urlencode.php
Hablan algo de compatibilidad y demás historias .. parece que lo que hay que usar preferentemente es rawurlencode() hoy por hoy.
Un saludo,