Le système de noms de domaine (DNS) n'a historiquement supporté que les lettres ASCII de base. Le Punycode permet d'y faire entrer des noms de domaine avec accents ou caractères non-latins — au prix d'une représentation peu intuitive.
Le DNS a été conçu dans les années 1980 avec un alphabet limité (lettres latines non accentuées, chiffres, tiret). Pour permettre l'enregistrement de domaines dans d'autres langues sans réécrire l'intégralité du système DNS mondial, l'IETF a normalisé l'IDNA (Internationalized Domain Names in Applications) : le nom est saisi en Unicode par l'utilisateur, puis automatiquement converti en une représentation ASCII compatible — le Punycode — préfixée par xn--.
Le domaine café.fr est en réalité enregistré et résolu dans le DNS sous la forme xn--caf-dma.fr. Le navigateur fait cette conversion de façon transparente : tu tapes la version accentuée, il interroge le DNS avec la version Punycode, et affiche généralement la version Unicode dans la barre d'adresse pour l'utilisateur.
Chaque label du domaine (la partie entre deux points) est converti indépendamment — un domaine commesous.café.fra son labelcaféconverti en Punycode, maissousetfrrestent inchangés puisqu'ils sont déjà en ASCII.
Certains caractères Unicode de scripts différents se ressemblent visuellement à l'identique (par exemple, le "a" latin et un "а" cyrillique). Un attaquant peut enregistrer un domaine visuellement quasi-indistinguable d'un domaine légitime en mélangeant les scripts — une technique appelée attaque homographe IDN. C'est pourquoi de nombreux navigateurs affichent directement la forme Punycode (xn--...) dans la barre d'adresse dès qu'un domaine mélange des scripts suspects, plutôt que la forme Unicode trompeuse.
Oui, dès qu'un domaine contient un caractère hors de l'alphabet ASCII de base, sa résolution DNS sous-jacente passe par une forme Punycode — même si l'utilisateur ne le voit jamais directement.
L'algorithme fonctionne sur n'importe quelle chaîne de caractères Unicode, mais en pratique il n'a de sens que pour des labels de noms de domaine, soumis par ailleurs à d'autres restrictions (longueur, caractères autorisés par registre).
Non, l'algorithme est unique et indépendant de la langue — il encode directement les points de code Unicode, quels que soient le script ou la langue d'origine.
Outils similaires