KeroTools

Encodeur et Décodeur d'Entités HTML

Encodez du texte en entités HTML sûres ou décodez-les, instantanément — outil gratuit pour développeurs.

Entrée
0 caractères
Sortie

Votre texte reste sur votre appareil

Rien à supprimer ensuite

Sûr pour de vraies données utilisateur

Fonctionne dans tout navigateur moderne

Comment ça marche

  1. 1

    Collez votre texte

    Une chaîne avec des chevrons, une esperluette, des guillemets ou des lettres accentuées à placer dans du balisage.

  2. 2

    Choisissez le contexte

    Texte, valeur d’attribut ou encodage complet — chacun échappe un jeu de caractères différent.

  3. 3

    Copiez le résultat

    Collez-le dans un gabarit, un document XML, un flux ou le corps d’un e-mail.

Pourquoi cet outil

Le contexte est un choix, pas une supposition

Échapper pour du texte, pour une valeur d’attribut et pour une URL sont trois travaux distincts, et vous choisissez lequel.

Le double encodage est détecté

Une entrée contenant déjà des entités est signalée, pour ne pas transformer une esperluette deux fois de suite.

Sortie nommée ou numérique

Les références numériques fonctionnent en XML, dans les flux et en SVG, où la plupart des entités nommées n’existent pas.

Décodage sûr en aller-retour

Les formes nommée et numérique sont reconnues, y compris l’écriture hexadécimale et les entités sans point-virgule.

Honnête sur ce que fait l’échappement

Il rend un texte sûr à placer dans un contexte, ce qui est moins ambitieux que rendre sûr du balisage non fiable.

Rien ne quitte le navigateur

Le texte est converti sur cette page : les tickets et les noms de clients qui vous servent d’exemple restent chez vous.

Il n’existe pas un « échappement HTML » unique — c’est le contexte qui décide

C’est l’idée qui rend le reste du sujet compréhensible. Un navigateur analyse un document dans plusieurs états différents, et les caractères capables de terminer l’état courant diffèrent dans chacun. Dans du texte, seuls `<` et `&` peuvent commencer quelque chose de nouveau : ce sont donc les deux à échapper. Dans une valeur d’attribut entre guillemets doubles, `<` est inoffensif et `"` est fatal, car le guillemet termine l’attribut. Dans une valeur d’attribut sans guillemets, une espace y met fin, tout comme une tabulation, un saut de ligne, un accent grave, un signe égal et un chevron fermant. Dans un bloc `<script>`, l’échappement HTML ne sert strictement à rien et c’est l’échappement de chaîne JavaScript qu’il faut. Voilà pourquoi une unique fonction `escape()` appliquée partout produit à la fois des sorties cassées et de vraies vulnérabilités : elle en fait trop là où les caractères étaient sûrs, et pas assez là où ils ne l’étaient pas. Choisir un contexte avant d’encoder n’est pas un raffinement — c’est toute la décision.

Seule une poignée de caractères doit changer

Il vaut la peine de savoir à quel point la liste est courte, car l’essentiel du sur-échappement vient de l’ignorer. Les caractères à valeur syntaxique en HTML sont `<`, `>`, `&`, `"` et l’apostrophe. Parmi eux, `&` doit toujours être échappé parce qu’il commence une entité, et `<` toujours parce qu’il commence une balise. `>` relève de la politesse plutôt que de l’obligation dans du texte — un navigateur affiche très bien un `>` nu — même si l’échapper est une habitude dans la plupart des bases de code, parce que cela ne coûte rien et aide quand le balisage est ensuite traité par un outil plus strict. Les deux guillemets ne comptent que dans les valeurs d’attribut, et seulement celui qui sert de délimiteur. Tout le reste — chaque lettre accentuée, chaque caractère arabe ou chinois, chaque émoji — n’a besoin d’aucun échappement dans un document UTF-8 : l’encodage s’en charge déjà. Transformer `café` en `caf&eacute;` est légal et presque toujours inutile ; cela alourdit le fichier et rend la recherche plus difficile.

L’espace fine insécable, ou le caractère français qui n’a pas d’entité nommée

La typographie française impose une espace avant le point-virgule, les deux-points, le point d’interrogation et le point d’exclamation, et cette espace doit être insécable pour que le signe ne se retrouve pas seul en début de ligne. Le caractère correct est l’espace fine insécable, U+202F — et elle n’a pas d’entité nommée en HTML. On voit donc trois solutions de contournement dans la nature, toutes fautives à leur manière : une espace ordinaire, qui laisse le point d’interrogation passer à la ligne suivante ; `&nbsp;`, qui est insécable mais trop large et donne une composition anglophone maladroite ; et `&thinsp;`, qui a la bonne largeur mais reste sécable. La forme numérique `&#8239;` est la seule à dire exactement ce qu’il faut, et elle a l’avantage de survivre aux formats qui ignorent les entités nommées. Le revers est qu’une chaîne pleine de U+202F casse silencieusement une recherche en base de données quand la saisie de l’utilisateur contient une espace normale — raison pour laquelle ce caractère appartient à la couche de présentation, jamais aux données stockées.

Le double encodage est le défaut que cet outil existe pour éviter

L’échappement n’est pas idempotent, et l’oublier produit l’un des défauts les plus reconnaissables du web. Encodez `&` une fois, vous obtenez `&amp;`. Encodez le résultat à nouveau, vous obtenez `&amp;amp;`, qui s’affiche sur la page comme le texte littéral `&amp;`. Vous l’avez déjà vu : des titres de page affichant « Tom &amp; Jerry », des objets d’e-mail avec `&#39;` au milieu d’un mot, des noms de produits entourés de `&quot;` dans les résultats de recherche. Cela arrive parce que l’échappement a été appliqué à deux couches qui s’ignoraient — un moteur de gabarits qui échappe automatiquement, plus un contrôleur qui a échappé par précaution avant de transmettre la chaîne. Le correctif est de ne jamais échapper deux fois, et la façon d’en être sûr est d’échapper exactement une fois, au dernier moment possible, à l’endroit où la chaîne entre dans le balisage. Tout ce qui est stocké déjà échappé dans une base finira par être échappé une seconde fois par ce qui l’affiche.

Les entités nommées sont une fonctionnalité de HTML, pas du texte

HTML5 définit plus de deux mille entités nommées, des familiers `&nbsp;` et `&copy;` jusqu’à des choses comme `&bigotimes;`. XML en définit exactement cinq : `&lt;`, `&gt;`, `&amp;`, `&quot;` et `&apos;`. Cet écart provoque une panne précise et fréquente. Mettez `&nbsp;` dans un flux RSS, un fichier SVG, un document XHTML, une mise en page Android ou une charge SOAP, et vous obtenez une erreur d’analyse : l’analyseur n’en a jamais entendu parler, et une entité non définie est fatale en XML au lieu d’être simplement ignorée. La forme numérique `&#160;` fonctionne partout, puisqu’elle n’a besoin d’aucune définition. Il existe un piège symétrique : `&apos;` fait partie des cinq de XML mais n’existait pas en HTML4, si bien que d’anciens documents HTML et certains clients de messagerie l’affichent en toutes lettres. Si une chaîne peut voyager entre formats — et la plupart le font dans une pile moderne — les références numériques sont l’écriture sûre.

Échapper n’est pas assainir, et la différence compte

On confond constamment les deux, et c’est dans cette confusion que vivent les failles d’injection. Échapper prend du texte et le rend sûr à placer dans un contexte donné, pour qu’il soit affiché plutôt qu’interprété. Assainir prend du balisage destiné à rester du balisage et en retire les parties dangereuses. Échapper un commentaire avant de l’afficher est correct ; échapper un champ de texte enrichi que l’utilisateur a le droit de mettre en forme détruit la mise en forme, et la réponse habituelle — laisser passer le HTML sans échappement — est ce qui ouvre réellement la brèche. L’exemple le plus tranchant de la différence est une URL : encodez un lien en entités et `javascript:alert(1)` survit parfaitement intact, car le décodage des entités a lieu avant la vérification du schéma, si bien que `&#106;avascript:` redevient `javascript:` et s’exécute. Aucune dose d’échappement HTML ne protège un `href` ; seule la validation du schéma le fait. L’échappement résout exactement un problème, et savoir lequel est tout l’enjeu.

Erreurs courantes à éviter

  • Utiliser une seule fonction d’échappement partout. Texte, valeurs d’attribut et blocs de script se terminent sur des caractères différents : un unique utilitaire en fait trop ici et pas assez là.
  • Échapper deux fois la même chaîne. L’échappement n’est pas idempotent — `&` devient `&amp;` puis `&amp;amp;`, d’où les titres de page qui affichent « Tom &amp; Jerry ».
  • Employer `&nbsp;` avant un point d’interrogation ou un point-virgule. L’espace correcte en français est l’espace fine insécable ; `&nbsp;` est insécable mais trop large et donne une composition anglophone.
  • Mettre des entités nommées dans du XML. Seules cinq y sont définies : `&nbsp;` est une erreur d’analyse fatale dans un flux, un SVG ou un XHTML, alors que `&#160;` fonctionne partout.
  • Compter sur l’encodage en entités pour rendre une URL sûre. Les entités sont décodées avant la vérification du schéma : `&#106;avascript:` redevient `javascript:` et s’exécute.

Comparaison

CritèreCet outilEncodeurs en ligneUne bibliothèque de langage
Texte envoyé à un serveurJamaisLe plus souventNon
Permet de choisir le contexteOuiRarementLe plus souvent
Alerte sur le double encodageOuiNonNon
Sortie numérique pour XMLOuiParfoisConfigurable
Décode tout le jeu nommé HTML5OuiPartiellementLe plus souvent
PrixGratuitGratuit / offres payantesGratuit

Fonctionnalités

Encodage et décodage

Les deux sens, pour vérifier ce qu’un système a produit aussi facilement que préparer ce que vous envoyez.

Encodage minimal ou complet

N’échappez que les caractères exigés par le contexte, ou tout caractère non-ASCII, selon la destination.

Prise en charge des entités nommées

Tout le jeu nommé de HTML5 est reconnu au décodage, y compris la longue traîne que personne ne tape à la main.

Hexadécimal et décimal

Les références numériques sont lues et écrites dans les deux écritures, car les vrais documents contiennent les deux.

Détection du double encodage

Les entités déjà présentes dans l’entrée sont mises en évidence avant que vous ne les encodiez une seconde fois.

Grandes entrées prises en charge

Un gabarit entier ou un long export se convertit sans envoi ni plafond de taille.

Rien à installer

Pas d’outil de build, pas d’environnement d’exécution, pas de dépendances : tout se passe sur la page web.

Compatible arabe et RTL

Interface complète en huit langues, dont l’arabe de droite à gauche.

Sécurisé par défaut

Servi en HTTPS, sans suivi du contenu ni envoi à un tiers.

Qui l’utilise

Développeurs web

Vérifier le comportement d’une chaîne une fois placée dans une valeur d’attribut.

Développeurs e-mail

Préparer objets et corps de message pour des clients qui analysent strictement.

Rédacteurs techniques

Montrer des exemples de code dans une page sans que le navigateur tente de les exécuter.

Qui débogue du texte abîmé

Décoder une chaîne arrivée avec `&amp;amp;` en plein milieu.

Questions Fréquentes

Non. Tout s’exécute localement dans votre navigateur — votre texte n’est jamais envoyé, stocké ni partagé.

Oui — entièrement gratuit, sans compte et sans limite.