¿Qué caracteres se deben escapar en una cadena de consulta HTTP?

Esta pregunta se refiere a los caracteres en la parte de la cadena de consulta de la URL, que aparecen después de? marca el caracter.

PorWikipedia, ciertos caracteres se dejan como están y otros están codificados (generalmente con un% secuencia de escape).

He estado tratando de rastrear esto hasta las especificaciones reales, de modo que entiendo la justificación detrás de cada punto en esa página de Wikipedia.

Ejemplo de contradicción 1:

losEspecificación HTML dice codificar el espacio como+ y difiere el resto aRFC1738. Sin embargo, este RFC dice que~ no es seguro y, además, "[todos] los 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á.

Ejemplo de contradicción 2:

Wikipedia establece que todos los caracteres que no menciona deben estar codificados.! no se menciona en Wikipedia. PeroRFC1738 Establece que! es un carácter "especial" y "puede usarse sin codificar". Esto parece contradecir Wikipedia que dice que debe estar codificada.

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 será 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]. Solo me gustaría saber los estándares reales sobre esto.

Conclusiones

El algoritmo descrito en Wikipedia codifica precisamente aquellos caracteres que no sonRFC3986 caracteres no reservados. 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 usan un RFC anterior. A modo de comparación, elRFC2396 caracteres no reservados son alfanuméricos y!'()*-._~.

A modo de comparación, elAlgoritmo de borrador de trabajo HTML5 codifica todos los caracteres que no sean alfanuméricos y*-._. La codificación de caso especial para el espacio permanece+. Las diferencias notables son que* no está codificado y~ está codificado (Técnicamente, este manejo de* es compatible con RFC3986 aunque* es enreserved porque está en elsub-delims que están permitidos en elquery producción.)

Respuestas a la pregunta(1)

Su respuesta a la pregunta