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:
- Gemena bokstäver (a-z)
- Siffror (0-9)
- Bindestreck (-)
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ünchen | xn--mnchen-3ya |
| 北京 | xn--fiqs8s |
| münchen.de | xn--mnchen-3ya.de |
| 中文.com | xn--fiq228c.com |
| café.com | xn--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:
- Är alltid gemener
- Förekommer aldrig i vanliga ASCII-domännamn
- Utlöser Unicode-avkodning i kompatibel programvara
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.