Punycode

Grunderna i domäner
Ett kodningssystem som omvandlar Unicode-domännamn till ett ASCII-kompatibelt format, så att internationaliserade domännamn fungerar med DNS.
← Tillbaka till Ordlistan

Vad är Punycode?

Punycode är en kodningsyntax som definieras i RFC 3492 som omvandlar Unicode-strängar till den begränsade ASCII-teckenuppsättningen som stöds av DNS. Det är den tekniska grunden som gör internationaliserade domännamn (IDN:er) möjliga, vilket möjliggör domännamn på vilket språk som helst för att fungera med den befintliga DNS-infrastrukturen.

Problemet som Punycode löser

Domännamnsystemet designades på 1980-talet med endast ASCII-tecken i åtanke. DNS-etiketter kan endast innehålla:

Denna begränsning uteslöt miljarder internetanvändare som inte använder det latinska alfabetet främst. Punycode överbryggar denna klyfta genom att koda vilken Unicode-sträng som helst till giltig ASCII.

Hur Punycode-kodning fungerar

Punycode använder en intelligent algoritm som bevarar ASCII-tecken medan icke-ASCII-tecken kodas till en kompakt ASCII-representation.

Kodningsprocessen

1. Separera tecken: Dela upp i ASCII- och icke-ASCII-tecken

2. Kopiera ASCII: Behåll alla ASCII-tecken på sina ursprungliga positioner

3. Koda icke-ASCII: Använd en generaliserad kodning för variabel längd

4. Lägg till prefix: Prepend "xn--" för att indikera Punycode-kodning

Exempel

Original (Unicode)Kodad (Punycode)
münchenxn--mnchen-3ya
北京xn--fiqs8s
münchen.dexn--mnchen-3ya.de
中文.comxn--fiq228c.com
café.comxn--caf-dma.com

Prefixet "xn--"

Prefixet "xn--" kallas ACE (ASCII Compatible Encoding)-prefix. Det signalerar till DNS-resolvers och applikationer att etiketten innehåller Punycode-kodad innehål. Detta prefix:

Punycode i praktiken

Webbläsarhantering

Moderna webbläsare hanterar Punycode automatiskt:

Användaren skriver: 中文.com

Webbläsaren skickar: xn--fiq228c.com (till DNS)

Webbläsaren visar: 中文.com (i adressfältet)

Utvecklarimplementering

JavaScript (Node.js):
const punycode = require('punycode/');

// Koda till Punycode

const encoded = punycode.toASCII('münchen.de');

// Resultat: xn--mnchen-3ya.de

// Avkoda från Punycode

const decoded = punycode.toUnicode('xn--mnchen-3ya.de');

// Resultat: münchen.de

Python:
domain = 'münchen.de'

encoded = domain.encode('idna').decode('ascii')

# Resultat: xn--mnchen-3ya.de

URL-hantering

När du arbetar med URL:er som innehåller IDN:er:

// URL API hanterar Punycode automatiskt

const url = new URL('https://中文.com/path');

console.log(url.hostname); // xn--fiq228c.com

console.log(url.href); // https://xn--fiq228c.com/path

Säkerhetskänslan

Punycodes förmåga att representera vilken Unicode-tecken som helst skapar säkerhetskänslan:

Visuell förfalskning

Angripare kan registrera domäner som ser identiska ut med legitima webbplatser:

аррlе.com (kyrilliska 'а' och 'р')

apple.com (latinska bokstäver)

Båda visar identiskt i vissa typsnitt men är olika domäner.

Webbläsarskydd

För att bekämpa förfalskning implementerar webbläsare skydd:

1. Blandad skripuppfattning: Visa Punycode för domäner som misstänks blanda skript

2. Förvirringsuppfattning: Flagga domäner som använder tecken som liknar ASCII

3. Vitlistning: Tillåt Unicode-visning endast för välkända TLD:er

Arbeta med Punycode i API:er

När du bygger domänverktyg:

Lagra alltid Punycode: Använd ASCII-formen internt för konsekvens och databasindexering. Acceptera båda formerna: Låt användare mata in antingen Unicode eller Punycode, konverterar efter behov. Visa Unicode: Visa den läsbara formen i användarinterfaces.
function normalizeDomain(input) {

const punycode = require('punycode/');

// Convert to lowercase Punycode for internal use

return punycode.toASCII(input.toLowerCase());

}

Punycode är transparent för de flesta användare men väsentlig kunskap för utvecklare som bygger internationaliserade webbapplikationer.

Använd Denna Kunskap

Använd DomScans API för att kontrollera domäntillgänglighet, hälsa och mer.