Pregunta URL que codifica el carácter de espacio: + o% 20?


Cuando hay un espacio en una URL codificada para +y cuando está codificado para %20?


568
2017-10-27 23:23


origen


Respuestas:


De Wikipedia (énfasis y enlace agregado):

Cuando se envían los datos que se han ingresado en formularios HTML, los nombres y valores del campo de formulario se codifican y envían al servidor en un mensaje de solicitud HTTP utilizando el método GET o POST o, históricamente, a través del correo electrónico. La codificación utilizada por defecto se basa en una versión muy temprana de las reglas generales de codificación porcentual de URI, con un cantidad de modificaciones como la normalización de nueva línea y el reemplazo de espacios con "+" en lugar de "% 20". El tipo de datos MIME codificados de esta manera es application / x-www-form-urlencoded, y actualmente está definido (todavía de manera muy desactualizada) en las especificaciones HTML y XForms.

Entonces el real usos de codificación porcentual %20 mientras que los datos del formulario en las URL están en una forma modificada que utiliza +. Entonces es más probable que solo veas + en las URL en la cadena de consulta después de una ?.


335
2017-10-27 23:26



Esta confusión se debe a que la URL aún está "rota" hasta el día de hoy.

Tomar "http://www.google.com"por ejemplo. Esta es una URL. Una URL es un localizador uniforme de recursos y en realidad es un puntero a una página web (en la mayoría de los casos). Las URL en realidad tienen una estructura muy bien definida desde la primera especificación en 1994.

Podemos extraer información detallada sobre el "http://www.google.com"URL:

+---------------+-------------------+   
|      Part     |      Data         |   
+---------------+-------------------+   
|  Scheme       | http              |   
|  Host         | www.google.com    |   
+---------------+-------------------+  

Si miramos una URL más compleja como:

"https: // bob: bobby@www.lunatech.com: 8080 / archivo; p = 1? q = 2 # tercer"

podemos extraer la siguiente información:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host             | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file;p=1           |
|  Path parameter   | p=1                 |
|  Query            | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

Los caracteres reservados son diferentes para cada parte.

Para las URL HTTP, un espacio en una parte del fragmento de ruta debe estar codificado en "% 20" (no, absolutamente no "+"), mientras que el carácter "+" en la parte del fragmento de ruta puede dejarse sin codificar.

Ahora en la parte de consulta, los espacios pueden codificarse como "+" (para compatibilidad con versiones anteriores: no intente buscarlos en el estándar URI) o "% 20" mientras que el carácter "+" (como resultado de esta ambigüedad ) tiene que ser escapado a "% 2B".

Esto significa que la cadena "azul + azul claro" tiene que codificarse de manera diferente en la ruta y las partes de la consulta:

"http://example.com/blue+light%20blue?blue%2Blight+blue".

A partir de ahí, puede deducir que la codificación de una URL completamente construida es imposible sin una conciencia sintáctica de la estructura de la URL.

A lo que se reduce esto es a:

Deberías %20 antes de ? y + después.

Fuente


204
2018-04-29 15:36



yo recomendaria %20.

¿Estás codificándolos?

Sin embargo, esto no es muy consistente en todos los idiomas. Si no me equivoco, en PHP urlencode() trata los espacios como + mientras que Python urlencode() los trata como %20.

EDITAR:

Parece que estoy equivocado. Python urlencode() (al menos en 2.7.2) utiliza quote_plus() en lugar de quote() y así codifica los espacios como "+". También parece que la recomendación del W3C es el "+" según aquí: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

Y, de hecho, puede seguir este interesante debate sobre el rastreador de problemas propio de Python sobre qué usar para codificar espacios: http://bugs.python.org/issue13866.

EDIT # 2:

Entiendo que la forma más común de codificación "" es como "+", pero solo una nota, puede ser solo yo, pero me parece un poco confuso:

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'

20
2017-10-27 23:31



Un espacio solo se puede codificar a "+" en la parte de consulta de pares de clave-valor de tipo de contenido "application / x-www-form-urlencoded" de una URL. Este es un MAYO, no un DEBER. En el resto de las URL, está codificado como% 20.

En mi opinión, es mejor codificar siempre espacios como% 20, no como "+", incluso en la parte de consulta de una URL, porque es la especificación HTML (RFC-1866) que especifica que los caracteres de espacio deben codificarse como " + "en" application / x-www-form-urlencoded "pares de clave-valor de tipo de contenido. (Consulte el párrafo 8.2.1, subpárrafo 1.) Esta forma de codificar datos de formulario también se proporciona en las especificaciones HTML posteriores, por ejemplo, busque párrafos relevantes sobre application / x-www-form-urlencoded en HTML 4.01 Specification, y así sucesivamente .

Aquí hay una cadena de muestra en URL donde la especificación HTML permite espacios de codificación como ventajas: "http://example.com/over/there?name=foo+bar"Entonces, solo después de"? ", Los espacios pueden reemplazarse por más, de acuerdo con la especificación HTML. En otros casos, los espacios deben codificarse en% 20. Pero dado que es difícil determinar correctamente el contexto, es la mejor práctica nunca codifique espacios como "+".

Recomendaría codificar porcentualmente todos los caracteres excepto "sin reserva" definido en RFC-3986, p.2.3

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

La implementación depende del lenguaje de programación que elija.

Si su URL contiene caracteres nacionales, primero codifíquelos en UTF-8 y luego codifique porcentualmente el resultado.


7
2017-10-27 19:29