PHP.de Wissenssammlung

Internationalisierte Domainnamen (IDN) / Punycode

Begriffserklärung
IDN, Punycode, Beispiele, E-Mail-Adressen
Anwendungsgebiete in PHP
Wann ist was zu tun?
Konvertierung in Punycode
externe Klassen, PHP-Boardmittel
RFC zum Thema IDN(A) / Punycode

Begriffserklärung

IDN (Internationalized domain name)

Wikipedia:

Als internationalisierte Domainnamen (englisch internationalized domain name; IDN), umgangssprachlich auch Umlautdomain oder Sonderzeichendomain, werden Domainnamen bezeichnet, die Umlaute, diakritische Zeichen oder Buchstaben aus anderen Alphabeten als dem lateinischen Alphabet enthalten. Solche Zeichen waren ursprünglich im Domain Name System nicht vorgesehen und wurden nachträglich durch den Internetstandard Internationalizing Domain Names in Applications (IDNA) ermöglicht.

Grundsätzlich sind alle Unicode-Zeichen in IDNs zulässig. Jede Vergabestelle für Domains regelt jedoch individuell, welche Zeichen sie für Domain-Registrierungen erlaubt.

Punycode

Wikipedia:

Punycode ist ein im RFC 3492 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.

Beipiele

Beispiele von IDN mit entsprechender Punycode-Darstellung:

müller.de    →  xn--mller-kva
übung.de     →  xn--bung-zra.de
dömäin.com   →  xn--dmin-moa0i.com
äaaa.com     →  xn--aaa-pla.com
déjà.vu.com  →  xn--dj-kia8a.vu.com
ñandú.com    →  xn--and-6ma2c.com

E-Mail-Adressen

Für E-Mail-Adressen gilt insgesamt selbiges wie oben erwähnt.

Beispiele von Wikipedia (en):

Pelé@example.com                 →  xn--pel-dma@example.com
δοκιμή@παράδειγμα.δοκιμή         →  xn--jxalpdlp@xn--hxajbheg2az3al.xn--jxalpdlp
чебурашка@ящик-с-апельсинами.рф  →  xn--80aabp1a8au3ao@xn-----8kcayoeblonkwzf2jqc1b.xn--p1ai

Anwendungsgebiete in PHP

Viele Funktionen, die Operationen mit Domains oder E-Mail-Adressen durchführen, benötigen bei der Anwendung mit Sonderzeichendomains eine vorherige Umwandlung in Punycode. Dies betrifft beispielsweise:

  • file_get_contents()
  • checkdnsrr()
  • filter_var($email, FILTER_VALIDATE_EMAIL) zur E-Mail-Validierung

Zusatzinfo für cURL

Bei der Anwendung von cURL ist es möglicherweise nicht separat nötig, die Sonderzeichendomains (IDN) vorher in Punycode zu wandeln. Ob cURL bereits mit IDN-Unterstützung verfügbar ist, ist in der phpinfo() ersichtlich.

cURL phpinfo()

Konvertierung

Externe Punycode-Klasse

Für die Punycode-Umwandlung gibt es einige PHP-Klassen im Web. Dazu für aktuelle Ergebnisse am besten eine Suchmaschine befragen. Weit verbreitet ist die PHP-Klasse idna_convert von Matthias Sommerfeld. Dort gibt es zudem einen Online-Punycode-Konverter.

Einige Beispiele mit dieser Klasse:

require 'idna_convert.class.php';
$idn = new idna_convert();

// kein Unicode
$domain = 'example.com';
echo $idn->encode($domain);
// example.com

// deutsche Umlaute
$domain = 'frühlingsgefühle.de';
echo $idn->encode($domain);
// xn--frhlingsgefhle-hsbj.de

// griechische Zeichen
$domain = 'παράδειγμα.δοκιμή';
echo $idn->encode($domain);
// xn--hxajbheg2az3al.xn--jxalpdlp

// kyrillische Zeichen
$domain = 'ящик-с-апельсинами.рф';
echo $idn->encode($domain);
// xn-----8kcayoeblonkwzf2jqc1b.xn--p1ai

E-Mail-Adressen:

$email = 'pelé@example.com';
echo $idn->encode($email);
// xn--pel-dma@example.com

$email = 'mail@übung.de';
echo $idn->encode($email);
// mail@xn--bung-zra.de

PHP-Boardmittel

Wenn folgende Voraussetzungen erfüllt sind…

PHP 5 >= 5.3.0, PECL intl >= 1.0.2, PECL idn >= 0.1

…, dann steht die Funktion idn_to_ascii() zur Konvertierung in Punycode direkt zur Verfügung. Somit könnte auf eine externe Klasse verzichtet werden.

Mit diesem Aufruf kann festgestellt werden, ob die Funktion verfügbar ist:

var_dump(function_exists('idn_to_ascii')); // true oder false

RFC zum Thema IDN(A) / Punycode

  • RFC 3454 - Preparation of Internationalized Strings (“stringprep”)
  • RFC 3490 - Internationalizing Domain Names in Applications (IDNA)
  • RFC 3491 - Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)
  • RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)
  • RFC 5890 - Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework
  • RFC 5891 - Internationalized Domain Names in Applications (IDNA): Protocol
  • RFC 5892 - The Unicode Code Points and Internationalized Domain Names for Applications (IDNA)
  • RFC 5893 - Right-to-Left Scripts for Internationalized Domain Names for Applications (IDNA)
  • RFC 5894 - Internationalized Domain Names for Applications (IDNA): Background, Explanation, and Rationale

Dieser Beitrag wird zur Zeit diskutiert und wurde zuletzt von mermshaus verändert.

Beiträge die zur Diskussion gestellt werden, enthalten mitunter Informationen bei denen wir uns noch bezüglich der finalen Darstellung absprechen müssen. Gedulde dich etwas, wir stellen diesen Beitrag fertig, sobald die Diskussion beendet ist.

An diesem Beitrag waren bisher beteiligt: hausl, mermshaus