Wat is Punycode?
Punycode is een codering syntax gedefinieerd in RFC 3492 die Unicode strings transformeert in de beperkte ASCII karakter set ondersteund door DNS. Het is de technische stichting die Internationalized Domain Names (IDNs) mogelijk maakt, waardoor domeinnamen in elke taal kunnen werken met de bestaande DNS-infrastructuur.
Het probleem Punycode lost op
Het domeinnaamsysteem werd ontworpen in de jaren 1980 met alleen ASCII-tekens in gedachten. DNS labels kunnen alleen bevatten:
- Kleine letters (a-z)
- Digits (0-9)
- Hyfenen (-)
Deze beperking sloot miljarden internetgebruikers uit die niet voornamelijk het Latijnse alfabet gebruiken. Punycode overbrugt deze kloof door een Unicode string te coderen naar geldige ASCII.
Hoe Punycode codering werkt
Punycode gebruikt een slim algoritme dat ASCII-tekens bewaart terwijl niet-ASCII-tekens worden gecodeerd in een compacte ASCII-weergave.
Het coderingsproces
1. Separate Characters: Opsplitsen in ASCII- en niet-ASCII-tekens
2. Copy ASCII: Houd alle ASCII-tekens in hun oorspronkelijke posities
3. Encodeer Non-ASCII: Gebruik een algemene variabele lengte integer codering
4. Voeg Prefix toe: Prepend "xn--" om Punycode-codering aan te geven
Voorbeelden
| Oorspronkelijk (Unicode) | Gecodeerd (Punycode) |
|---|---|
| münchen | xn--mnchen-3ya |
| Wat? | xn--fiqs8s |
| münchen.de | xn--mnchen-3ya.de |
| xn--fiq228c.com | |
| café.com | xn--caf-dma.com |
Het "xn-" Prefix
Het "xn--" voorvoegsel wordt het ACE (ASCII Compatible Encoding) voorvoegsel genoemd. Het geeft aan DNS resolvers en toepassingen dat het label bevat Punycode gecodeerde inhoud. Dit voorvoegsel:
- Is altijd kleine letters
- Nooit verschijnt in gewone ASCII domeinnamen
- Triggers Unicode decoderen in conforme software
Punycode in de praktijk
Browser Handling
Moderne browsers verwerken Punycode automatisch:
User types: 中文.com
Browser sends: xn--fiq228c.com (to DNS)
Browser displays: 中文.com (in address bar)
Uitvoering van de ontwikkelaar
JavaScript (Node.js):const punycode = require('punycode/');
// Encode to Punycode
const encoded = punycode.toASCII('münchen.de');
// Result: xn--mnchen-3ya.de
// Decode from Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Result: münchen.de
Python:
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Result: xn--mnchen-3ya.de
URL-handling
Bij het werken met URL's die IDN's bevatten:
// URL API handles Punycode automatically
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
Veiligheidsimplicaties
Punycode's vermogen om een Unicode-karakter te vertegenwoordigen creëert beveiligingsrisico's:
Visual Spoofing
Aanvallers kunnen domeinen registreren die identiek lijken aan legitieme sites:
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
Beide tonen identiek in sommige lettertypen, maar zijn verschillende domeinen.
Browserbeveiliging
Om spoofing te bestrijden, bieden browsers bescherming:
1. Mixed Script Detection: Weergave Punycode voor domeinen mengen scripts verdacht
2. Confuseerbare detectie: Vlag domeinen met behulp van tekens die eruit zien als ASCII
3. Whitelisting: Unicode-weergave alleen toestaan voor bekende TLD's
Werken met Punycode in API's
Bij het bouwen van domeingereedschappen:
Always Store Punycode: Gebruik het ASCII-formulier intern voor consistentie en database-indexering. Accept Both Forms: Laat gebruikers invoeren of Unicode of Punycode, converteren naar behoefte. Display Unicode: Toon de menselijk leesbare vorm in gebruikersinterfaces.function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
Punycode is transparant voor de meeste gebruikers, maar essentiële kennis voor ontwikkelaars bouwen geinternationaliseerde webapplicaties.