Punycode ist ein im RFC 3492[1] standardisiertes Kodierungsverfahren zum Umwandeln von Unicode-Zeichenketten in ASCII-kompatible Zeichenketten, die aus den Zeichen a
bis z
, 0
bis 9
und dem Bindestrich (-
) bestehen. Punycode wurde entworfen, um internationalisierte Domainnamen aus Unicode-Zeichen eindeutig und umkehrbar durch ASCII-Zeichen darzustellen.
Der wichtigste Grund für die Einführung von Punycode war die Tatsache, dass in dem etablierten Domain Name System nur Namen zugelassen sind, die aus den 26 lateinischen Buchstaben, den Ziffern 0 bis 9, sowie einem Bindestrich-Minus („Tastatur-Bindestrich“) bestehen. Für die englische Sprache war dies ausreichend, doch die meisten anderen Sprachen enthalten weitere Zeichen – die deutsche Sprache beispielsweise die Umlautbuchstaben ä
, ö
und ü
sowie das ß
. Um beliebige Texte aus derartigen Sprachen verarbeiten zu können, wurde 2003 das Verfahren Internationalizing Domain Names in Applications (IDNA) eingeführt, das Punycode als Kodierungsverfahren einsetzt.
Soll ein Text an ein System übergeben werden, das nur ASCII beherrscht, so wird er zuvor per Punycode in ASCII umgesetzt. Zu beachten ist, dass sich in vielen Fällen der resultierende Text verlängert. Soll umgekehrt dieser Text aus dem ASCII-System entnommen werden, so wird er per Punycode in die ursprüngliche Form zurückübersetzt. Enthält ein Text keinerlei Sonderzeichen, so wird er durch dieses Verfahren nicht verändert.
Das Punycode-Konvertierungsverfahren wurde unter Wahrung folgender Gesichtspunkte festgelegt:
a
bis z
nicht verändert werdenZeichenkette | Punycode | IDNA | |
---|---|---|---|
abcdef | abcdef- | abcdef | * |
abæcdöef | abcdef-qua4k | xn--abcdef-qua4k | |
schön | schn-7qa | xn--schn-7qa | |
ยจฆฟคฏข | 22cdfh1b8fsa | xn--22cdfh1b8fsa | |
☺ | 74h | xn--74h | |
74h | 74h- | 74h | * |
xn-- | xn--- | n. def. | |
*Punycode wird nicht verwendet |
Als Basiszeichen gelten im Folgenden die Buchstaben a
bis z
und die Ziffern 0
bis 9
. Zusammen mit dem Bindestrich-Minus (-
) als Trennzeichen stellen diese 37 Zeichen die einzig gültigen Zeichen in einem nach Punycode kodierten Text dar.
Enthält die zu konvertierende Zeichenkette
Um die resultierende Zeichenkette möglichst kompakt zu gestalten, werden die Sonderzeichen nicht „eins-zu-eins“, sondern nach dem Punycode-Verfahren kodiert. Die Nicht-Basiszeichen werden zuerst nach ihrem Zahlenwert (Unicode-Codepoint, z. B. "ä" → 228, "ж" → 1078) sortiert. Die Differenz zwischen den Werten der einzelnen Zeichen wird zusammen mit der jeweiligen Position in der ursprünglichen Zeichenkette zu einer Zahl kodiert. Diese Zahl wird anschließend durch die 36 Basiszeichen dargestellt und an den Text angehängt. Die Details zu diesem Verfahren sind in RFC 3492[1] festgelegt, wo auch eine Referenzimplementierung in der Programmiersprache C für die Kodierung und die Dekodierung sowie zahlreiche Beispiele enthalten sind.
Bei der Bildung von Domainnamen nach dem Standard Internationalizing Domain Names in Applications (IDNA) wird bei Vorhandensein von Nicht-Basiszeichen das Präfix „xn--
“ vorangestellt, und andernfalls (nur Basiszeichen) kommt Punycode nicht zur Anwendung.
Zu beachten ist des Weiteren, dass bei der Bildung eines IDNA-Domainnamens vor der Kodierung nach Punycode der Domainname nach bestimmten Regeln normalisiert wird (z. B. wird er in Kleinbuchstaben umgewandelt und bestimmte Unicode-Zeichen auf andere, als „äquivalent“ geltende gemappt). Diese Normalisierung ist nicht Teil von Punycode und i. d. R. nicht eindeutig umkehrbar.