Estoy escribiendo código que genera HTML automáticamente, y quiero que codifique las cosas correctamente.
Digamos que estoy generando un enlace a la siguiente URL:
http://www.google.com/search?rls=en&q=stack+overflow
Supongo que todos los valores de los atributos deben estar codificados en HTML. (Corríjame si me equivoco). Eso significa que si estoy colocando la URL anterior en una etiqueta de anclaje, debería codificar el ampersand como &
, así:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
¿Es eso correcto?
Respuestas:
Sí lo es. Las entidades HTML se analizan dentro de los atributos HTML, y un extravío
&
crearía una ambigüedad. Es por eso que siempre debe escribir en&
lugar de solo&
dentro de todos los atributos HTML.Dicho esto, solo las
&
comillas deben codificarse. Si tiene caracteres especiales comoé
en su atributo, no necesita codificarlos para satisfacer el analizador HTML.Solía ser el caso de que las URL necesitaran un tratamiento especial con caracteres no ASCII, como
é
. Tenías que codificar aquellos que usaban porcentajes de escape, y en este caso daría%C3%A9
, porque fueron definidos por RFC 1738 . Sin embargo, RFC 1738 ha sido reemplazado por RFC 3986 (URI, identificadores uniformes de recursos) y RFC 3987 (IRI, identificadores de recursos internacionalizados), en los que WhatWG basó su trabajo para definir cómo deben comportarse los navegadores cuando ven una URL con un código no ASCII personajes en él desde HTML5 . Por lo tanto, ahora es seguro incluir caracteres que no sean ASCII en las URL, con codificación de porcentaje o no.fuente
é
todavía necesita codificación: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
en el atributo de etiqueta en lugar de usarlo directamente&
.Según las recomendaciones HTML oficiales actuales, el ampersand debe escaparse, por ejemplo,
&
en contextos como este. Sin embargo, los navegadores no lo requieren, y HTML5 CR propone hacer de esto una regla , de modo que se apliquen reglas especiales en los valores de los atributos. Los validadores HTML5 actuales están desactualizados a este respecto (consulte el informe de errores con comentarios).Seguirá siendo posible escapar de los símbolos en los valores de los atributos, pero aparte de la validación con las herramientas actuales, no hay necesidad práctica de escapar de ellos en los
href
valores (y existe un pequeño riesgo de cometer errores si comienza a escapar de ellos).fuente
application/xhtml+xml
) probablemente siempre lo requiera.&
se supone que está bien ahora, siempre y cuando sea " poco ambiguo". Una forma obvia de hacer que el ampersand sea ambiguo es seguirlo primero con caracteres no espaciales y luego con un punto y coma. Ese signo es ahora ambiguo, y se causar un error de análisis.&
sea ambiguo. Por lo tanto, continuamos usándolo sin codificar en los atributos href.Estoy publicando una nueva respuesta porque encuentro que la respuesta de zneak no tiene suficientes ejemplos, no muestra el manejo de HTML y URI como diferentes aspectos y estándares y faltan algunas cosas menores.
Tiene dos estándares con respecto a las URL en los enlaces (
<a href
).El primer estándar es RFC 1866 (HTML 2.0) donde en "3.2.1. Caracteres de datos" puede leer los caracteres que deben escaparse cuando se usan como valor para un atributo HTML. (Los atributos en sí mismos no permiten caracteres especiales, por ejemplo,
<a hr&ef="http://...
no está permitido ni lo está<a hr&ef="http://...
).Más tarde, esto se ha incorporado al estándar HTML 4 , los caracteres que necesita para escapar son:
El otro estándar es RFC 3986 "Estándar genérico de URI", donde se manejan las URL (esto sucede cuando el navegador está a punto de seguir un enlace porque el usuario hizo clic en el elemento HTML).
Es importante escapar de esos caracteres para que el cliente sepa si representan datos o un delimitador.
Ejemplo sin escapes:
Ejemplo, URL totalmente legítima
Ejemplo de URL totalmente legítima en el valor del atributo HTML:
También escenarios importantes:
Javascript como valor:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Sí,;;
es correcto)JSON como valor:
<a href="..." data-analytics="{"event": "click"}">...</a>
Cosas escapadas dentro de cosas escapadas, doble codificación, URL dentro de URL dentro de parámetro, etc., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
fuente
Sí, debes convertirte
&
a&
.Esta herramienta de validación html de W3C es útil para preguntas como esta. Le informará los errores y advertencias de una página en particular.
fuente
&
en un href) como un error.