231 votes

Dois-je vraiment coder "&" comme "&" ?

J'utilise un ' & avec HTML5 et UTF-8 dans la page d'accueil de mon site. <title> . Google affiche bien l'esperluette sur son SERPs comme le font tous les navigateurs dans leurs titres.

http://validator.w3.org me donne ça :

& n'a pas commencé une référence de caractère. (& aurait probablement dû être échappé comme &amp; .)

Est-ce que j'ai vraiment besoin de faire &amp; ?

Je ne m'inquiète pas de la validation de mes pages pour le plaisir de les valider, mais je suis curieux d'entendre l'opinion des gens à ce sujet, si c'est important et pourquoi.

65 votes

Les spécifications ne le disent pas. L'affiche fait référence à HTML5 qui n'exige pas l'échappement de l'esperluette dans tous les scénarios.

2 votes

Il devrait s'agir de la Communauté Wiki, puisque vous recherchez des opinions, et ne pas être pointilleux sur la validation implique qu'il n'y a pas de base objective sur laquelle répondre.

10 votes

@Richard : vraiment ? Bien que je ne sois pas d'accord avec le fait que "la validation n'a pas d'importance", je vois cela comme une question très objective : "est-ce que ça casse autre chose que la spécification ?"

156voto

Delan Azabani Points 33013

Oui. Comme le disait l'erreur, en HTML, les attributs sont #PCDATA, ce qui signifie qu'ils sont analysés. Cela signifie que vous pouvez utiliser des entités de caractères dans les attributs. Utilisation de & en soi est erroné et, si ce n'est pour les navigateurs indulgents et le fait qu'il s'agit de HTML et non de XHTML, briserait l'analyse. Il suffit de l'échapper comme &amp; et tout irait bien.

HTML5 vous permet de ne pas l'échapper, mais uniquement lorsque les données qui suivent ne ressemblent pas à une référence de caractère valide. Cependant, il est préférable d'échapper toutes les instances de ce symbole plutôt que de se demander lesquelles doivent l'être et lesquelles n'ont pas besoin de l'être.

Gardez ce point à l'esprit ; si vous n'échappez pas & à &, c'est déjà assez mauvais pour les données que vous créez (où le code pourrait très bien être invalide), vous pourriez aussi ne pas échapper les délimiteurs de balises, ce qui est un énorme problème pour les données soumises par les utilisateurs, qui pourraient très bien conduire à l'injection de HTML et de script, au vol de cookies et à d'autres exploits.

S'il vous plaît, échappez votre code. Cela vous évitera bien des soucis à l'avenir.

13 votes

Aucun navigateur ne pourra jamais "mal interpréter" un & par lui-même. Tous les navigateurs existants l'affichent comme "&". Considérant qu'il a explicitement demandé une raison pratique de le faire, et qu'il a déclaré qu'il ne se soucie pas de la validation

53 votes

Oui. Mais moralement, devrions-nous en s'appuyant sur sur l'indulgence et la gestion "agréable" des erreurs des navigateurs ? Ou devrions-nous simplement écrire du code correct ?

8 votes

@Delan : bien que j'essaie de faire en sorte que chaque page que j'écris soit valide, je comprends en lisant sa question qu'il ne se soucie pas de "moralement". Il se soucie juste de savoir si ça marche ou pas. Ce sont deux philosophies différentes, qui ont toutes deux leurs avantages et leurs inconvénients, et il n'y a pas de philosophie "correcte". Par exemple, ce site Web n'est pas valide, et pourtant c'est un excellent site.

63voto

Richard JP Le Guen Points 13306

La validation mise à part, il n'en reste pas moins que le codage de certains caractères est important pour un document HTML afin qu'il puisse être rendu correctement et en toute sécurité en tant que page Web.

Encodage & como &amp; en toutes circonstances, est pour moi une règle plus facile à vivre, qui réduit la probabilité d'erreurs et d'échecs.

Comparez les éléments suivants : lequel est le plus facile ? Lequel est le plus facile faire des bêtises ?

Méthodologie 1

  1. Écrivez du contenu qui comprend des caractères d'esperluette.
  2. Encodez-les tous.

Méthodologie 2

(avec un grain de sel, s'il vous plaît ;) )

  1. Écrivez du contenu qui comprend des caractères d'esperluette.
  2. Au cas par cas, examinez chaque esperluette. Déterminez si :
  • Il est isolé, et en tant que tel, il est sans ambiguïté une esperluette. ex. volt & amp
     > Dans ce cas, ne prenez pas la peine de l'encoder.
  • Elle n'est pas isolée, mais vous estimez qu'elle est néanmoins sans ambiguïté, car l'entité résultante n'existe pas et n'existera jamais puisque la liste des entités n'a jamais pu évoluer. Par exemple, amp&volt
     >. Dans ce cas, ne prenez pas la peine de l'encoder.
  • Il n'est pas isolé, et il est ambigu. Par exemple, volt&amp
     > Encodez-le.

? ?

3 votes

Le deuxième cas de amp&volt es ambiguë : est &volt maintenant une référence à une entité ou non ?

7 votes

@Gumbo L'esperluette dans amp&volt es no une esperluette ambiguë (selon la définition de la spécification HTML). Voir mathiasbynens.be/notes/ambiguous-ampersands y mothereff.in/ampersands#amp%26volt .

0 votes

@MathiasBynens A l'heure actuelle (2019), la définition d'une esperluette ambiguë semble avoir un peu changé depuis la définition que vous avez citée en 2011 dans mathiasbynens.be/notes/ambiguous-ampersands .

31voto

Mathias Bynens Points 41065

J'ai fait des recherches approfondies sur ce sujet et j'ai écrit sur mes conclusions ici : http://mathiasbynens.be/notes/ambiguous-ampersands

J'ai également créé un outil en ligne que vous pouvez utiliser pour vérifier que votre balisage ne contient pas d'esperluettes ambiguës ou de références de caractères qui ne se terminent pas par un point-virgule, ces deux éléments n'étant pas valides. (Aucun validateur HTML ne fait actuellement cela correctement).

http://i.imgur.com/cLssU.png

25voto

Matthew Wilson Points 2628

Les règles du HTML5 sont différentes de celles du HTML4. Ce n'est pas obligatoire en HTML5 - sauf si l'esperluette semble commencer un nom de paramètre. "&copy=2" est toujours un problème, par exemple, puisque &copy ; est le symbole du droit d'auteur.

Il me semble cependant qu'il est plus difficile de décider de coder ou non en fonction du texte suivant. Le chemin le plus facile est donc probablement d'encoder tout le temps.

2 votes

C'est comme citer les valeurs des attributs - vous n'êtes pas obligé de le faire, mais vous ne pouvez pas vous tromper si vous le faites tout le temps.

3 votes

&copy=2 n'est pas un problème aussi important que vous le pensez. Dans les valeurs d'attributs (par exemple, l'attribut href ), l'attribut &copy ne sera pas considéré comme une référence de caractère pour © . En dehors d'une valeur d'attribut, ce serait.

0 votes

Étant donné qu'une esperluette est normalement précédée et suivie d'un espace dans un texte anglais, il n'est pas difficile de se souvenir ou de penser à la règle que je suis : Si l'esperluette ne touche pas un autre caractère visible, ce qui est presque toujours le cas, alors elle n'a pas besoin d'être encodée. Sinon, il suffit de l'encoder par souci de simplicité.

20voto

Ryan Kinal Points 8903

Je pense que cette question s'est transformée en une question de "pourquoi suivre la spécification quand les navigateurs ne s'en soucient pas". Voici ma réponse généralisée :

Les normes ne sont pas une chose "actuelle". Elles sont une chose "future". Si nous, en tant que développeurs, suivons les normes du web, les fournisseurs de navigateurs sont plus susceptibles d'appliquer correctement ces normes, et nous nous rapprochons d'un web totalement interopérable, où les bidouillages CSS, la détection des fonctionnalités et la détection des navigateurs ne sont pas nécessaires. Nous n'aurons pas à nous demander pourquoi nos mises en page ne fonctionnent pas dans un navigateur particulier, ni comment contourner ce problème.

Plus précisément, si HTML5 n'exige pas l'utilisation de & dans votre situation spécifique, et que vous utilisez un doctype HTML5 (et que vous vous attendez à ce que vos utilisateurs utilisent des navigateurs conformes à HTML5), il n'y a aucune raison de le faire.

2 votes

Cela étant dit, d'une manière générale, vous devez vous rappeler que la plupart des moyens "standard" sont encore à l'état de projet et peuvent changer à l'avenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X