Punycode

Domein-basis
Een coderingssysteem dat Unicode-domeinnamen converteert naar ASCII-compatibel formaat, waardoor geïnternationaliseerde domeinnamen met DNS kunnen werken.
← Terug naar Woordenlijst

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:

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ünchenxn--mnchen-3ya
Wat?xn--fiqs8s
münchen.dexn--mnchen-3ya.de
xn--fiq228c.com
café.comxn--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:

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.

Pas Deze Kennis Toe

Gebruik de API van DomScan om domeinbeschikbaarheid, gezondheid en meer te controleren.