Intermédiaire 8 min de lecture 25 janvier 2025

IDN Punycode : comprendre, encoder et décoder vos noms de domaine

Vos utilisateurs saisissent des domaines avec accents ou alphabets non latins, mais le DNS ne parle qu’ASCII. C’est exactement ce que résolvent l’IDN et le Punycode : afficher en Unicode, transmettre en ASCII. Voici l’essentiel pour convertir correctement, éviter les pièges et fiabiliser vos intégrations.

Qu'est-ce que l'IDN et le Punycode ?

L’IDN permet d’écrire des noms de domaine en Unicode (U-labels) tandis que le Punycode les convertit en ASCII (A-labels) préfixés par xn-- pour la résolution DNS.

Voici les principales notions à connaître :

1 Noms de domaine ASCII (LDH)

Alphabet latin minuscule, chiffres et tiret. Base historique du DNS.

LDH: a-z, 0-9, "-" | Exemple: example.com | Longueur label ≤ 63

2 U-labels (IDN en Unicode)

Étiquettes lisibles par l’humain, contenant accents ou autres écritures.

münich.de, café.fr, новости.рф, 東京.jp

3 Punycode (A-labels en ASCII)

Représentation ASCII pour le DNS, préfixée par xn--, issue d’IDNA2008/UTS#46.

münich.de ➜ xn--mnich-kva.de
café.fr ➜ xn--caf-dma.fr
новости.рф ➜ xn--b1agrl.xn--p1ai
東京.jp ➜ xn--1lqs71d.jp

4 Points techniques importants

Normalisation, règles de sécurité et politiques de TLD :

IDNA2008, UTS #46 (mappage et validation)
Normalisation Unicode (NFC) et mise en minuscules
Règles de scripts, confusions (homographes)
Politiques TLD sur caractères autorisés

Problèmes classiques

Copier-coller d’URL IDN

Mélange U-label et A-label (xn--) dans la même base de données ou config.

Tests unitaires qui échouent

Comparaison directe Unicode vs Punycode sans conversion préalable.

Validation naïve de nom d’hôte

Regex LDH qui rejette les U-labels ou interdit les préfixes xn-- valides.

Regex et normalisation incomplètes

Absence d’IDNA2008/UTS#46, mélange de formes Unicode non normalisées.

Exemple de problème courant :

# Deux URL pointent vers le même domaine mais sont écrites différemment
url1 = "https://münich.de"
url2 = "https://xn--mnich-kva.de" # A-label
assert url1 == url2 # ❌ Échec sans conversion IDNA

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
La barre d’adresse affiche xn--... à la place du domaine attendu en Unicode
!
Un certificat TLS ne correspond pas car le SAN est en Punycode
!
dig/host résolvent le xn-- mais pas la version Unicode directe
!
Un e-mail rebondit avec un domaine IDN alors que l’ASCII passe
!
Des URLs presque identiques mènent à des sites différents (risque d’homographes)

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence les caractères non LDH dans vos domaines, vérifie la conformité IDNA et facilite la conversion entre U-labels et Punycode.

✅ Détection automatique

Caractères Unicode hors LDH, préfixes xn--, points de séparation

📊 Analyse complète

Validation IDNA2008/UTS#46, positions et recommandations

🧹 Conversion rapide

U-label ➜ A-label (Punycode) et inversement

💾 Export propre

Résultats prêts pour DNS, certificats et logs

Autres méthodes de détection

Affichage dans l'éditeur

Affichez les points de code Unicode et mettez en évidence les caractères non LDH
Utilisez une extension qui convertit/valide l’IDN et le Punycode

En ligne de commande (Unix)

# Encoder en Punycode (IDNA2008/UTS#46)
idn2 münich.de # ➜ xn--mnich-kva.de
# Décoder un A-label vers Unicode
idn2 -d xn--mnich-kva.de # ➜ münich.de
# Tester la résolution DNS
dig +short xn--mnich-kva.de A
# Vérifier un certificat avec SNI en Punycode
openssl s_client -connect xn--mnich-kva.de:443 -servername xn--mnich-kva.de

En code

JavaScript

// Node: const punycode = require('punycode/'); punycode.toASCII('münich.de'); // ➜ xn--mnich-kva.de

Python

import idna; idna.encode("münich.de").decode()

Excel / Google Sheets

Pas de fonction native IDNA/Punycode — utiliser un script (Apps Script) ou un convertisseur externe

Nettoyer et prévenir

🚀 Conversion et validation rapides avec Clean ASCII

Avant d’écrire vos propres routines, utilisez Clean ASCII pour encoder/décoder et valider vos domaines IDN en quelques secondes.

U-label ⇆ A-label (Punycode)
Validation IDNA/UTS#46
Export immédiat pour DNS et certificats

Méthodes techniques avancées

🔧 Normaliser

Appliquez le processing UTS #46 (mappage, vérifications) et IDNA2008
Normalisez en NFC, mettez en minuscules, retirez les points de début/fin
Uniformisez les séparateurs (.) et la longueur des labels

🧹 Filtrer

Refusez les points de code interdits, contrôles et mélanges de scripts confusants
Autorisez les préfixes xn-- uniquement quand l’étiquette est valide
Appliquez les politiques TLD (tables de langues, scripts permis)

⚙️ Automatiser

Hooks pre-commit: convertir U-labels en Punycode dans zones/config
Vérifications backend sur les entrées (IDNA, longueur, labels)
Linting CI des URLs/domains (formats U-label/A-label cohérents)

Checklist rapide

Stockage DNS et certificats en Punycode (A-labels)
Conversion systématique U-label ⇆ A-label aux frontières
Validation conforme IDNA2008/UTS #46
Regex de contrôle LDH et préfixe xn-- bien définies
Tests contre les homographes/homoglyphes fréquents
Documentation développeurs sur IDN, Punycode, DNS et SNI

Conclusion

L’IDN et le Punycode rendent les domaines lisibles et compatibles avec le DNS. Maîtriser l’encodage et la validation vous évite les erreurs sournoises.

Adoptez une conversion systématique, appliquez IDNA/UTS#46 et vous éliminez l’essentiel des soucis d’intégration, de sécurité et de résolution.

Convertissez vos domaines IDN maintenant

Utilisez notre outil pour encoder/décoder en Punycode et vérifier la conformité de vos noms de domaine.

Analyser mes domaines