Punycode ist ein stan­dar­di­sier­tes Ko­die­rungs­ver­fah­ren, das Unicode-Zeichen in einen be­grenz­ten ASCII-Zei­chen­satz übersetzt. Dadurch können in­ter­na­tio­na­li­sier­te Domain-Namen (IDN) auch Son­der­zei­chen wie Umlaute enthalten.

Ent­ste­hung des Ko­die­rungs­ver­fah­rens

Punycode wurde 2003 von der Internet En­gi­nee­ring Task Force (IETF) als Syntax zur Kodierung in­ter­na­tio­na­li­sier­ter Domain-Namen in An­wen­dun­gen (IDNA) fest­ge­legt. Unter IDN versteht die IETF Domains, die neben dem la­tei­ni­schen Alphabet auch Umlaute oder Schrift­zei­chen anderer Alphabete nutzen. Da Basis-Pro­to­kol­le wie das Domain Name System (DNS) diese nicht direkt ver­ar­bei­ten, spricht man im deutsch­spra­chi­gen Raum oft von Um­laut­do­mains.

Ein Domain-Name wie müller-büromöbel ist unter der Endung .de seit der IDN-Ein­füh­rung erlaubt. Für die tech­ni­sche Ver­ar­bei­tung – etwa bei der Na­mens­auf­lö­sung – ist jedoch eine Um­wand­lung nötig. Viele Internet-Pro­to­kol­le basieren auf Englisch und un­ter­stüt­zen daher nur den ein­ge­schränk­ten ASCII-Zei­chen­satz.

Um die Kom­pa­ti­bi­li­tät von IDNs mit alten In­ter­net­stan­dards zu sichern, schrieb die IETF die Kodierung mit her­kömm­li­chen Zeichen vor. Als Lösung wurde dafür das Verfahren Punycode stan­dar­di­siert.

Hinweis

Bei E-Mail-Adressen greift Punycode nur beim Teil nach dem @-Zeichen (der Domain). Der lokale Teil davor wird mittels UTF-8 kodiert, falls er Son­der­zei­chen enthält.

So funk­tio­niert die Punycode-Kodierung

Das Verfahren im Überblick

In RFC 3492 definiert die IETF Punycode als Anwendung eines Bootstring-Al­go­rith­mus. Dieser Bootstring-Al­go­rith­mus bildet beliebige Zei­chen­sät­ze eindeutig mit einer kleinen Auswahl an Elementen ab. Bei Punycode sind das die Ba­sis­zei­chen: Klein­buch­sta­ben, Ziffern und der Bin­de­strich (-). Das Verfahren basiert auf sechs Prin­zi­pi­en:

  • Voll­stän­dig­keit: Jede Kette lässt sich per Bootstring ver­ein­facht dar­stel­len.
  • Ein­deu­tig­keit: Die Zuordnung ist fix. Jedem Punycode ent­spricht genau ein ASCII-Ge­gen­stück.
  • Re­ver­si­bi­li­tät: Die Um­wand­lung lässt sich ohne Da­ten­ver­lust jederzeit umkehren.
  • Effizienz: Der kodierte Text bleibt in der Länge fast identisch zum Original.
  • Ein­fach­heit: Die Al­go­rith­men für den Wechsel sind un­kom­pli­ziert aufgebaut.
  • Les­bar­keit: Nur nicht dar­stell­ba­re Zeichen werden kodiert. Alles andere bleibt gleich.

Punycode passt Bootstring exakt an die An­for­de­run­gen in­ter­na­tio­na­ler Domains an, um Unicode-Zeichen über Ba­sis­zei­chen ab­zu­bil­den.

Pra­xis­bei­spiel

Hier siehst du, wie die Kodierung konkret abläuft.

IDN: müller-büromöbel

Dieser Name enthält mit ü und ö Zeichen, die nicht im Standard-Satz für Domains vorkommen. Deshalb muss er via Punycode um­ge­wan­delt werden.

Schritt 1: Nor­ma­li­sie­rung

Zuerst wird die Zei­chen­ket­te nor­ma­li­siert: Groß­buch­sta­ben werden klein, und Ligaturen wie das ß werden zu „ss“ aufgelöst.

Schritt 2: Entfernen der Son­der­zei­chen

Alle Nicht-Ba­sis­zei­chen werden entfernt. Sie werden am Ende in kodierter Form, getrennt durch einen Bin­de­strich, wieder angefügt.

Für In­ter­net­adres­sen bekommt das Ergebnis zu­sätz­lich ein ACE-Präfix (ASCII Com­pa­ti­ble Encoding):

ACE-Präfix: xn–

Dieses Präfix ver­hin­dert, dass Domains mit Bin­de­stri­chen irr­tüm­lich als in­ter­na­tio­na­le Domains gedeutet werden.

Die fertige Kodierung für müller-büromöbel lautet:

ACE: xn–mller-brombel-rmb4fg

Der schlaue Al­go­rith­mus sorgt dafür, dass die Ma­xi­mal­län­ge von 63 Zeichen pro Domain-Label nicht über­schrit­ten wird.

Dabei werden Zeichen nicht einfach eins zu eins ersetzt. Der Al­go­rith­mus berechnet einen String aus den Abständen und Po­si­tio­nen der ent­fern­ten Zeichen.

Im Beispiel zeigt rmb4fg an, wo im Rest­string mller-brombel die Zeichen ü und ö wieder eingefügt werden müssen.

Bild: Übersicht der ACE-String-Abschnitte
Der ACE-String setzt sich aus dem Präfix und dem kodierten Teil zusammen.

Son­der­fäl­le

Es gibt Ausnahmen, wenn ein Domain-Name nur aus Son­der­zei­chen oder nur aus Ba­sis­zei­chen besteht.

Besteht eine Domain nur aus Nicht-Ba­sis­zei­chen, sieht man nach der Kodierung nur das Präfix und die kodierte Folge. Ein Beispiel ist παράδειγμα (grie­chisch für „Beispiel“):

IDN: παράδειγμα

ACE: xn–hxajbheg2az3al

Enthält ein Name nur Ba­sis­zei­chen, wird Punycode nicht genutzt. Es gibt dann auch kein Präfix, da die Domain ohnehin von allen Pro­to­kol­len ver­stan­den wird.

Beim Fully Qualified Domain Name (FQDN) wird jeder Teil (wie Top-Level- oder Subdomain) einzeln kodiert. So wird aus пример.бг (bul­ga­risch für beispiel.bg):

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

Die Tabelle zeigt die ver­schie­de­nen Varianten im Überblick:

IDN Punycode ACE
Gemischte Zeichen müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Nur Son­der­zei­chen Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Nur Ba­sis­zei­chen example.org example.org Nicht notwendig
Hinweis

Details zum Al­go­rith­mus findest du in RFC 3492, inklusive einer Um­set­zungs­hil­fe in der Pro­gram­mier­spra­che C.

In der Praxis nutzt man für die Um­wand­lung meist einfache Punycode-Converter aus dem Web.

Punycode bei Emoji-Domains

Auch Emoji-Domains funk­tio­nie­ren über Punycode. Das klappt, wenn die jeweilige Endung Emojis erlaubt und das Symbol im Unicode-Standard steht.

Tipp

Aktuell erlauben unter anderem diese TLDs Emoji-Domains: .ws, .tk, .to, .ml, .ga, .cf, .gq und .fm.

Technisch sind es Punycode-Strings, die für dich ei­gent­lich als bunte Icons er­schei­nen sollten.

Emoji-Domain: https://i❤.ws/

ACE: https://xn--i-7iq.ws/

Aktuell zeigen gängige Browser wie Firefox oder Chrome in der Adress­zei­le meist nur den ACE-String anstatt des Emojis an.

Gratis Punycode-Converter

Im Netz gibt es viele kos­ten­lo­se Tools, um IDNs in die ASCII-Form zu bringen.

Für ös­ter­rei­chi­sche oder deutsche Domains empfehlen wir den IDN-Web-Converter der DENIC eG. Er arbeitet nach mo­derns­ten Standards und minimiert Fehler zwischen ver­schie­de­nen IDNA-Versionen.

Bild: DENIC Punycode-Converter
Der Converter zeigt alle erlaubten Zeichen für .de-Domains an.

Für in­ter­na­tio­na­le Endungen eignet sich der Punycode-Converter von Mathias Bynens, der auf dem bewährten Tool punycode.js basiert.

Bild: Punycode-Converter von Mathias Bynens
Ein quell­of­fe­nes Tool zur schnellen Um­wand­lung in­ter­na­tio­na­ler Domains.

Ist Punycode ein Si­cher­heits­ri­si­ko?

Pro­ble­ma­tisch wird Punycode bei ho­mo­gra­fi­schen Phishing-Attacken. Hier nutzen Angreifer ähnlich aus­se­hen­de Zeichen aus, um User auf ge­fälsch­te Seiten zu locken. Ein solcher Phishing-Angriff wird oft durch URLs wie https://www.xn--80ak6aa92e.com/ getarnt, die im Browser dann wie https://www.аррӏе.com/ aussehen.

Das führt dann nicht zu Apple, sondern auf eine prä­pa­rier­te Testseite.

Statt des normalen „a“ wird ein ky­ril­li­sches „а“ verwendet. Mit freiem Auge ist das kaum zu sehen, für den Browser sind es aber zwei völlig ver­schie­de­ne Ziele. Auch SSL-Zer­ti­fi­ka­te bieten hier keinen Schutz, da Kri­mi­nel­le für ihre Fake-Domains pro­blem­los echte Zer­ti­fi­ka­te erhalten können.

Moderne Browser wie Chrome zeigen bei Verdacht lieber den ACE-String an, Microsoft Edge blockiert solche Seiten oft direkt. Firefox bietet stan­dard­mä­ßig noch weniger Schutz vor dieser Masche.

Bild: Homografischer Angriff Beispiel
Optisch gleicht die URL der echten Apple-Seite, nutzt aber ky­ril­li­sche Zeichen zur Täuschung.

Schutz für Firefox-Nutzer: Du kannst die au­to­ma­ti­sche Über­set­zung in IDNs im Browser de­ak­ti­vie­ren:

  1. Kon­fi­gu­ra­ti­ons­me­nü: Tippe about:config in die Adress­zei­le ein.
  2. Punycode erzwingen: Suche nach network.IDN_show_punycode und stelle den Wert per Dop­pel­klick auf true um.

Danach zeigt Firefox in­ter­na­tio­na­le Domains in der Adress­zei­le nur noch als ACE-String an.

Zum Hauptmenü