J'écris du code qui génère automatiquement du HTML et je veux qu'il encode les choses correctement.
Supposons que je génère un lien vers l'URL suivante:
http://www.google.com/search?rls=en&q=stack+overflow
Je suppose que toutes les valeurs d'attribut doivent être encodées en HTML. (Veuillez me corriger si je me trompe.) Cela signifie que si je mets l'URL ci-dessus dans une balise d'ancrage, je devrais encoder l'esperluette comme suit &
:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Est-ce exact?
Réponses:
Oui, ça l'est. Les entités HTML sont analysées à l'intérieur des attributs HTML, et une erreur
&
créerait une ambiguïté. C'est pourquoi vous devriez toujours écrire&
au lieu de simplement&
intérieur de tous les attributs HTML.Cela dit, seuls
&
et les citations ont besoin être encodés. Si vous avez des caractères spéciaux commeé
dans votre attribut, vous n'avez pas besoin de les encoder pour satisfaire l'analyseur HTML.Auparavant, les URL nécessitaient un traitement spécial avec des caractères non ASCII, comme
é
. Vous deviez encoder ceux à l'aide de pourcent-échappements, et dans ce cas, cela donnerait%C3%A9
, car ils étaient définis par la RFC 1738 . Cependant, la RFC 1738 a été remplacée par la RFC 3986 (URI, Uniform Resource Identifiers) et RFC 3987 (IRI, Internationalized Resource Identifiers), sur lesquelles le WhatWG a basé son travail pour définir comment les navigateurs doivent se comporter lorsqu'ils voient une URL non ASCII. caractères depuis HTML5 . Il est donc désormais sûr d'inclure des caractères non ASCII dans les URL, encodés en pourcentage ou non.la source
é
a encore besoin d'encodage: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
dans l'attribut de balise au lieu d'utiliser directement&
.Selon les recommandations HTML officielles actuelles, l'esperluette doit être échappée, par exemple, comme
&
dans des contextes comme celui-ci. Cependant, les navigateurs n'en ont pas besoin et le CR HTML5 propose d'en faire une règle , de sorte que des règles spéciales s'appliquent dans les valeurs d'attribut. Les validateurs HTML5 actuels sont obsolètes à cet égard (voir rapport de bogue avec commentaires).Il restera possible d'échapper aux esperluettes dans les valeurs d'attributs, mais en dehors de la validation avec les outils actuels, il n'y a aucun besoin pratique de les échapper dans les
href
valeurs (et il y a un petit risque de faire des erreurs si vous commencez à les échapper).la source
application/xhtml+xml
) en aura probablement toujours besoin.&
est censé être correct maintenant, tant qu'il est " non ambigu". Une manière évidente de rendre l'esperluette ambiguë est de la suivre d'abord avec des caractères non espace, puis un point-virgule. Ce esperluette est maintenant ambiguë, et va provoquer une erreur d' analyse.&
soit ambiguë. Par conséquent, nous continuons à l'utiliser non codé dans les attributs href.Je poste une nouvelle réponse parce que je trouve que la réponse de zneak ne contient pas assez d'exemples, ne montre pas la gestion du HTML et des URI comme des aspects et des normes différents et manque de petites choses.
Vous avez deux standards concernant les URL dans les liens (
<a href
).La première norme est RFC 1866 (HTML 2.0) où dans "3.2.1. Caractères de données" vous pouvez lire les caractères qui doivent être échappés lorsqu'ils sont utilisés comme valeur pour un attribut HTML. (Les attributs eux-mêmes n'autorisent pas du tout les caractères spéciaux, par exemple, ce
<a hr&ef="http://...
n'est pas autorisé, ni<a hr&ef="http://...
.)Plus tard, cela est entré dans la norme HTML 4 , les caractères dont vous avez besoin pour échapper sont:
L'autre standard est la RFC 3986 "Generic URI standard", où les URL sont gérées (cela se produit lorsque le navigateur est sur le point de suivre un lien parce que l'utilisateur a cliqué sur l'élément HTML).
Il est important d'échapper à ces caractères pour que le client sache s'ils représentent des données ou un délimiteur.
Exemple non échappé:
Exemple, URL entièrement légitime
Exemple d'URL entièrement légitime dans la valeur de l'attribut HTML:
Également des scénarios importants:
Javascript comme valeur:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Oui,;;
c'est exact.)JSON comme valeur:
<a href="..." data-analytics="{"event": "click"}">...</a>
Objets échappés à l'intérieur des objets échappés, double encodage, URL dans l'URL à l'intérieur du paramètre, etc.
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
la source
Oui, vous devriez vous convertir
&
en&
.Cet outil de validation html du W3C est utile pour des questions comme celle-ci. Il vous indiquera les erreurs et les avertissements pour une page particulière.
la source
&
dans un href) comme une erreur.