Zum Inhalt springen

„Punycode“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Thornard (Diskussion | Beiträge)
tk k
 
(38 dazwischenliegende Versionen von 27 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Punycode''' ist ein im <nowiki>RFC&nbsp;3492</nowiki><ref name="RFC3492" /> standardisiertes [[Kodierung]]sverfahren zum Umwandeln von [[Unicode]]-Zeichenketten in [[American Standard Code for Information Interchange|ASCII]]-kompatible Zeichenketten, die aus den Zeichen <code>a</code> bis <code>z</code>, <code>0</code> bis <code>9</code> und dem Bindestrich (<code>-</code>) bestehen. Punycode wurde entworfen, um [[Internationalisierter Domainname|internationalisierte Domainnamen]] aus Unicode-Zeichen eindeutig und umkehrbar durch ASCII-Zeichen darzustellen.
{{Linkbox Unicode}}
'''Punycode''' ist ein im RFC 3492 standardisiertes [[Kodierung]]sverfahren zum Umwandeln von [[Unicode]]-Zeichenketten in sogenannte ACE-Zeichenketten, die nur noch aus [[alphanumerisch]]en Zeichen bestehen, wie sie in [[Domain]]s erlaubt sind. Punycode wurde entworfen, um Domainnamen aus Unicodezeichen eindeutig und umkehrbar durch [[ASCII]]-Zeichen darzustellen.


== Motivation ==
== Grund der Einführung ==

Wichtigste Motivation 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 [[Buchstabe]]n, den [[Ziffer]]n 0 bis 9, sowie dem [[Bindestrich]] bestehen. Für die [[englische Sprache]] war dies ausreichend, doch die meisten anderen Sprachen enthalten weitere Zeichen – die [[deutsche Sprache]] beispielsweise die [[Umlaut#Umlautbuchstaben|Umlautbuchstaben]] <code>ä</code>, <code>ö</code> und <code>ü</code> sowie das <code>ß</code>. Um beliebige Texte aus derartigen Sprachen verarbeiten zu können, wurde 2003 das Punycode-Verfahren eingeführt.
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 [[Buchstabe]]n, den [[Ziffer]]n 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 [[Umlaut#Umlaut als Bezeichnung von Buchstaben|Umlautbuchstaben]] <code>ä</code>, <code>ö</code> und <code>ü</code> sowie das <code>[[ß]]</code>. 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.
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:
Das Punycode-Konvertierungsverfahren wurde unter Wahrung folgender Gesichtspunkte festgelegt:
* Vollständigkeit: Jeder Name kann umgesetzt werden
; Vollständigkeit: Jeder Name kann umgesetzt werden
* Eindeutigkeit: Jedem Namen ist genau eine Umsetzung zugeordnet
; Eindeutigkeit: Jedem Namen ist genau eine Umsetzung zugeordnet
* Reversibilität: Jeder umgesetzte Name kann zurückkonvertiert werden
; Reversibilität: Jeder umgesetzte Name kann zurückkonvertiert werden
* Effizienz: Der umgesetzte Name ist nicht wesentlich länger als der Ausgangsname
; Effizienz: Der umgesetzte Name ist nicht wesentlich länger als der Ausgangsname
* Einfachheit: Das Verfahren ist relativ einfach zu implementieren
; Einfachheit: Das Verfahren ist relativ einfach zu implementieren
* Lesbarkeit: Der umgesetzte Name bleibt im Wesentlichen lesbar, da die Zeichen <code>a</code> bis <code>z</code> nicht verändert werden
; Lesbarkeit: Namen aus im Wesentlichen lateinischen Buchstaben bleiben häufig lesbar, da die Zeichen <code>a</code> bis <code>z</code> nicht verändert werden


== Regeln der Umwandlung ==
== Regeln der Umwandlung ==
{| class="prettytable float-right"
{| class="wikitable float-right"
|+ Beispiele
|+ Beispiele
|-
! Zeichenkette
! Zeichenkette
! Punycode
! Codierung
!colspan="2"| IDNA
|-
|-
| abcdef
| abcdef
| abcdef-
| abcdef
| abcdef
|*
|-
|-
| abæcdöef
| abæcdöef
| abcdef-qua4k
| abcdef-qua4k
| xn--abcdef-qua4k
|
|-
|-
| schön
| schön
| schn-7qa
| schn-7qa
| xn--schn-7qa
|
|-
|-
| ยจฆฟคฏข
| ยจฆฟคฏข
| 22cdfh1b8fsa
| 22cdfh1b8fsa
| xn--22cdfh1b8fsa
|
|-
|-
| ☺
| ☺
| 74h
| 74h
| xn--74h
|
|-
| 74h
| 74h-
| 74h
|*
|-
| xn--
| xn---
| ''n. def.''
|
|-
|colspan="4"| *Punycode wird nicht verwendet
|}
|}
Als Basiszeichen gelten im folgenden die Buchstaben ''a'' bis ''z'' und die Ziffern ''0'' bis ''9'' (Groß- und Kleinschreibung spielt keine Rolle). Zusammen mit dem Bindestrich - als Trennzeichen stellen diese 37 Zeichen die einzig gültigen Zeichen in einem nach Punycode kodierten Text dar.
Als Basiszeichen gelten im Folgenden die Buchstaben <code>a</code> bis <code>z</code> und die Ziffern <code>0</code> bis <code>9</code>. Zusammen mit dem Bindestrich-Minus (<code>-</code>) als Trennzeichen stellen diese 37 Zeichen die einzig gültigen Zeichen in einem nach Punycode kodierten Text dar.


Enthält die zu konvertierende Zeichenkette
Enthält die zu konvertierende Zeichenkette
* nur Basiszeichen, so wird sie nicht verändert.
* nur Basiszeichen, so wird ein Minuszeichen angehängt;
* sowohl Basiszeichen als auch Nicht-Basiszeichen, werden alle Basiszeichen unter Beibehaltung ihrer Reihenfolge aufgeführt und schließlich die kodierten Nicht-Basiszeichen durch einen Bindestrich getrennt angehängt.
* sowohl Basiszeichen als auch Nicht-Basiszeichen, werden alle Basiszeichen unter Beibehaltung ihrer Reihenfolge aufgeführt und schließlich die kodierten Nicht-Basiszeichen durch ein Bindestrich-Minus getrennt angehängt;
* nur Nicht-Basiszeichen, so ist das Umwandlungsergebnis nur deren Codefolge, ohne Trennzeichen
* nur Nicht-Basiszeichen, so ist das Umwandlungsergebnis nur deren Codefolge, ohne Trennzeichen.


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 sortiert. Die Differenz zwischen den Werten der einzelnen Zeichen wird mit der jeweiligen Position in der ursprünglichen Zeichenkette zur Bildung einer Zahl verwendet. Diese Zahl wird anschließend durch die 37 Basiszeichen dargestellt und an den kodierten Text angehängt. Die Details zu diesem Verfahren sind in RFC 3492 festgelegt, wo auch eine Referenzimplementierung in der [[C (Programmiersprache)|Programmiersprache C]] für die [[Kodierung]] und die [[Dekodierung]], sowie zahlreiche Beispiele enthalten sind.
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.&nbsp;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 <nowiki>RFC&nbsp;3492</nowiki><ref name="RFC3492" /> festgelegt, wo auch eine Referenzimplementierung in der [[C (Programmiersprache)|Programmiersprache&nbsp;C]] für die [[Kodierung]] und die [[Dekodierung]] sowie zahlreiche Beispiele enthalten sind.


Bei der Bildung von Domainnamen nach dem [[Internationalizing Domain Names in Applications]]-Standard (IDNA) wird bei Vorhandensein von Nicht-Basiszeichen ein „<code>xn--</code>“ Präfix vorangestellt, und andernfalls (nur Basiszeichen) kommt Punycode nicht zur Anwendung.
Bei der Bildung von Domainnamen nach dem Standard [[Internationalizing Domain Names in Applications]] (IDNA) wird bei Vorhandensein von Nicht-Basiszeichen das Präfix „<code>xn--</code>“ 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.&nbsp;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.&nbsp;d.&nbsp;R. nicht eindeutig umkehrbar.
== Browser mit Punycode-Unterstützung ==
Da Punycode vor allem bei [[Umlautdomain]]s für [[Website]]s auf Zustimmung stieß, wurde dessen Implementierung, obwohl im Prinzip keine Verbindung zum [[Web]] besteht, zunächst in [[Browser]]n durchgeführt. Browser mit Punycode-Unterstützung sind zum Beispiel:
* [[Google Chrome|Chrome]]
* [[Mozilla Firefox|Firefox]]
* [[Internet Explorer]] ab Version 7 (Version 5 und 6 nur mittels Zusatzmodulen von Drittanbietern)
* [[Konqueror]]
* [[Mozilla Application Suite]]
* [[Opera]]
* [[Safari (Browser)|Safari]]
* [[SeaMonkey]] ab Version 1.0


== Weblinks ==
== Weblinks ==
* RFC 3492 Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)
* {{RFC-Internet |Autor=A. Costello |RFC=3492 |Titel=Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) |Datum=2003-03 |Errata=1}}
* {{Internetquelle
* [http://idnaconv.phlymail.de/?lang=de Exemplarischer Punycode-Konverter]
|url=https://mothereff.in/punycode
[[Kategorie:Internet]]
|titel=Online-Punycode-Konverter
[[Kategorie:Unicode]]
|abruf=2017-03-13}}
* {{Internetquelle
|url=https://cryptii.com/pipes/bootstring
|titel=Online Punycode und Bootstring Konverter
|abruf=2019-04-28}}


== Einzelnachweise ==
[[cs:Punycode]]
<references>
[[en:Punycode]]
<ref name="RFC3492">
[[es:Punycode]]
{{RFC-Internet |Autor=A. Costello |RFC=3492 |Titel=Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) |Datum=2003-03 |Errata=1}}
[[fr:Punycode]]
</ref>
[[it:Punycode]]
</references>
[[ja:Punycode]]

[[ko:퓨니코드]]
[[Kategorie:Internetstandard]]
[[pl:Punycode]]
[[pt:Punycode]]
[[Kategorie:Unicode]]
[[ru:Punycode]]
[[sv:Punycode]]
[[zh:域名服務器#Punycode]]

Aktuelle Version vom 12. Juni 2023, 22:39 Uhr

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.

Grund der Einführung

[Bearbeiten | Quelltext bearbeiten]

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:

Vollständigkeit
Jeder Name kann umgesetzt werden
Eindeutigkeit
Jedem Namen ist genau eine Umsetzung zugeordnet
Reversibilität
Jeder umgesetzte Name kann zurückkonvertiert werden
Effizienz
Der umgesetzte Name ist nicht wesentlich länger als der Ausgangsname
Einfachheit
Das Verfahren ist relativ einfach zu implementieren
Lesbarkeit
Namen aus im Wesentlichen lateinischen Buchstaben bleiben häufig lesbar, da die Zeichen a bis z nicht verändert werden

Regeln der Umwandlung

[Bearbeiten | Quelltext bearbeiten]
Beispiele
Zeichenkette 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

  • nur Basiszeichen, so wird ein Minuszeichen angehängt;
  • sowohl Basiszeichen als auch Nicht-Basiszeichen, werden alle Basiszeichen unter Beibehaltung ihrer Reihenfolge aufgeführt und schließlich die kodierten Nicht-Basiszeichen durch ein Bindestrich-Minus getrennt angehängt;
  • nur Nicht-Basiszeichen, so ist das Umwandlungsergebnis nur deren Codefolge, ohne Trennzeichen.

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.

  • A. Costello: RFC: 3492 – Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) [Errata: RFC 3492]. März 2003 (englisch).
  • Online-Punycode-Konverter. Abgerufen am 13. März 2017.
  • Online Punycode und Bootstring Konverter. Abgerufen am 28. April 2019.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. a b A. Costello: RFC: 3492 – Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) [Errata: RFC 3492]. März 2003 (englisch).