9.7 Net_IDNA 

Besprochene Version: 0.5.0 | Lizenz: LGPL |
Klassendatei(en): Net/IDNA/php5.php |
Net_IDNA ist eine Klasse, die es Ihnen erleichtert, mit internationalen Domainnamen umzugehen. Seit geraumer Zeit sind in vielen Toplevel-Domains wie .de oder .com Domainnamen mit Sonderzeichen wie www.möhrke.com zulässig. Da Sonderzeichen wie ä, ö oder ß nicht kompatibel mit dem Domain Name System sind, werden solche Domainnamen in den so genannten Punycode übersetzt. Net_IDNA nimmt diese Konvertierung für Sie vor bzw. konvertiert auch wieder aus dem Punycode zurück. Bitte beachten Sie dabei, dass das ß leider einfach durch ein ss dargestellt wird.
In diesem Paket sind zwei unterschiedliche Dateien für PHP 4 und 5 vorgesehen, in denen die Klassen auch unterschiedlich benannt sind. Nachfolgend werde ich mich nur auf PHP 5 beziehen.
Die Nutzung ist denkbar einfach, da Sie nur zwei Methoden benötigen. Ein wenig gewöhnungsbedürftig mag allerdings sein, dass die Methoden auf Basis von UTF-8 arbeiten. Ein- und Ausgaben müssen somit konvertiert werden, wenn Sie – was wahrscheinlich ist – ISO-8859–1 nutzen.
require_once('Net/IDNA/php5.php'); $coder=new Net_IDNA_php5(); $domain = utf8_encode('www.möhrke.com'); echo $coder->encode($domain);
Listing 9.9 Konvertierung nach Punycode
Als Ergebnis von Listing 9.9 wird der String www.xn--mhrke-jua.com ausgegeben. Geben Sie diesen in einen Browser ein, werden Sie an die korrekte Domain www.möhrke.com weitergeleitet.
Die Umkehrmethode decode() ist ein wenig umständlicher zu handhaben, da sie nur den reinen Domainnamen ohne www und Toplevel-Domain akzeptiert:
require_once("Net/IDNA/php5.php"); $coder=new Net_IDNA_php5(); // Domain uebergeben $domain = 'www.xn--mhrke-jua.com'; // Domain aufteilen $daten = explode('.',$domain); // Nur den eigentlichen Domainnamen dekodieren $dom_utf8=$coder->decode($daten[1]); // von UTF-8 nach ISO wandeln und ausgeben $dom_iso=utf8_decode($dom_utf8); echo "$daten[0].$dom_iso.$daten[2]";
Listing 9.10 Dekodierung einer Domain in Punycode
Auch wenn ich in diesen Beispielen keinen Wert auf die Fehlerbehandlung gelegt habe, möchte ich doch darauf hinweisen, dass die Fehler in diesem Paket auf Basis von Exceptions behandelt werden.