Esta pregunta se refiere a los caracteres en la porción de cadena de consulta de la URL, que aparecen después del carácter de marca ?
.¿Qué caracteres se deben escapar en una cadena de consulta HTTP?
Por Wikipedia, ciertos caracteres se dejan como están y otros se codifican (generalmente con una secuencia de escape %
).
He estado tratando de rastrear esto hasta las especificaciones reales, por lo que entiendo la justificación detrás de cada viñeta en esa página de Wikipedia.
contradicción Ejemplo 1:
El HTML specification dice al espacio codificar como +
y aplaza el resto a RFC1738. Sin embargo, este RFC dice que ~
no es seguro y además que "[a] ll caracteres inseguros siempre deben estar codificados dentro de la URL". Esto parece contradecir Wikipedia.
En la práctica, IE8 codifica ~
en las cadenas de consulta que genera, mientras que FF3 lo deja como está.
contradicción Ejemplo 2:
Wikipedia afirma que todos los caracteres que no se mencionan deben ser codificados. !
no se menciona en Wikipedia. Pero RFC1738 indica que !
es un carácter "especial" y "puede usarse sin codificar". Esto parece contradecir Wikipedia que dice que debe estar codificado.
En la práctica, IE8 codifica !
en las cadenas de consulta que genera, mientras que FF3 lo deja como está.
Entiendo que la moraleja de esto probablemente sea codificar aquellos caracteres que están en duda entre Wikipedia y las especificaciones. Quizás incluso yendo tan lejos como para codificar todo lo que no es [A-Za-z0-9]. Me gustaría saber los estándares reales sobre esto.
Conclusiones
el algoritmo descrito en Wikipedia codifica precisamente aquellos caracteres que no son RFC3986 unreserved characters. Es decir, codifica todos los caracteres que no sean alfanuméricos y -._~
. Como caso especial, el espacio se codifica como +
en lugar de %20
por RFC3986.
Algunas aplicaciones utilizan un RFC anterior. Para la comparación, el RFC2396 unreserved characters son alfanuméricos y !'()*-._~
.
Para comparar, el HTML5 working draft algorithm codifica todos los caracteres que no sean alfanuméricos y *-._
. La codificación de caso especial para espacio sigue siendo +
. Las diferencias notables son que *
no está codificado y ~
está codificado. (Técnicamente, este manejo de *
es compatible con RFC3986 a pesar de que está en *
reserved
porque está en la sub-delims
que se permite en la producción query
.)
Wikipedia no es un organismo de normas. Si tiene dudas, use el estándar. –
@John, aunque es importante usar el estándar * correcto *. Que es 3986 en este caso, no el antiguo 1738. –