No puedo decirte cuántas horas de mi vida he desperdiciado en este tipo de errores idiotas.
Básicamente estoy construyendo una URL como: https://example.com/?test=' . urlencode('meow+foo@gmail.com');
Luego, lo muestro desde la URL, así: echo urldecode($_GET['test']);
Y luego muestra: meow foo@gmail.com .
Puaj.
Si en cambio hago esto: echo $_GET['test'];
Obtengo: meow+foo@gmail.com .
(Naturalmente, hacer eco de una variable GET como esa es una locura, por lo que, por supuesto, haría htmlspecialchars a su alrededor en realidad. Pero ese no es el punto que estoy tratando aquí).
Entonces, dado que los navegadores (o algo así) claramente están haciendo esta "traducción" o "descodificación" automáticamente, hacerlo nuevamente lo estropea al eliminar ciertos caracteres, en este caso el "+" (más). Lo que me lleva a creer que se supone que no debo usar urldecode / rawurldecode en absoluto.
Pero entonces, ¿por qué existen?
Entonces, ¿cuándo uno querría usarlos?
Hace poco tuve un caso en el que agregamos activadores a un depósito de S3 que una función de Lambda seleccionaba y enviaba a través de una solicitud HTTP a un punto final de la API.
Si la ruta del archivo en S3 fuera de varias palabras, reemplazaría el espacio con un + , momento en el que rompería nuestro código porque técnicamente la ruta es incorrecta.
Una vez que lo ejecuta a través urldecode , se convierte en una ruta válida porque según los documentos:
Decodifica cualquier codificación %## en la cadena dada. Los símbolos más ('+') se decodifican en un carácter de espacio.
Ese sería un caso de uso válido para esta función ya que no está involucrado ningún navegador. Solo procesos/solicitudes en segundo plano.