Signatur
Beschreibung
idn_to_utf8() nimmt einen in Punycode codierten Domainnamen (z. B. xn--n3h.example.com) und wandelt ihn in seine lesbare Unicode-Form (z. B. ☁.example.com) um. Dies ist nützlich, wenn Domainnamen für die Anzeige gegenüber Benutzern aufbereitet werden sollen, da Punycode-Zeichenketten für Menschen schwer lesbar sind.
Die Funktion ist Teil der Intl-Erweiterung und setzt voraus, dass diese in PHP aktiviert ist. Sie unterstützt zwei IDNA-Varianten: INTL_IDNA_VARIANT_2003 (veraltet, seit PHP 7.2 als deprecated markiert) und INTL_IDNA_VARIANT_UTS46 (empfohlen, entspricht dem aktuellen Standard).
Über den Parameter $idna_info können detaillierte Informationen zur Verarbeitung abgerufen werden, darunter result, isTransitionalDifferent und errors. Dies hilft dabei, fehlerhafte oder nicht konforme Domainnamen zu erkennen und gezielt auf Fehler zu reagieren.
Die Gegenfunktion idn_to_ascii() wandelt einen Unicode-Domainnamen in seine ASCII-konforme (Punycode-)Form um, die für DNS-Anfragen benötigt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $domain Pflicht | string | Der zu konvertierende Domainname in IDNA-ASCII- bzw. Punycode-Codierung (z. B. xn--bcher-kva.example.de). |
|
| $flags | int | IDNA_DEFAULT | Steuert das Verhalten der Konvertierung. Mögliche Konstanten sind u. a. IDNA_DEFAULT, IDNA_ALLOW_UNASSIGNED, IDNA_USE_STD3_RULES, IDNA_CHECK_BIDI, IDNA_CHECK_CONTEXTJ und IDNA_NONTRANSITIONAL_TO_UNICODE. Mehrere Flags können mit | kombiniert werden. |
| $variant | int | INTL_IDNA_VARIANT_UTS46 | Die zu verwendende IDNA-Variante. Empfohlen ist INTL_IDNA_VARIANT_UTS46. INTL_IDNA_VARIANT_2003 ist seit PHP 7.2 als veraltet markiert und sollte nicht mehr verwendet werden. |
| $idna_info | array | [] | Wird nur bei INTL_IDNA_VARIANT_UTS46 befüllt. Enthält nach dem Aufruf die Schlüssel result (konvertierter Wert), isTransitionalDifferent (bool) und errors (Bitmask mit aufgetretenen Fehlercodes). |
Rückgabewert
false zurückgegeben.Beispiele
Einfache Konvertierung eines Punycode-Domainnamens
<?php
// Punycode-Form eines deutschen Umlauts-Domainnamens
$punycode = 'xn--bcher-kva.example.de';
$unicode = idn_to_utf8($punycode, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
if ($unicode !== false) {
echo 'Unicode-Domainname: ' . $unicode . PHP_EOL;
} else {
echo 'Konvertierung fehlgeschlagen.' . PHP_EOL;
}
Konvertierung mit Fehleranalyse via idna_info
<?php
$punycode = 'xn--n3h.example.com'; // ☁.example.com
$idnaInfo = [];
$unicode = idn_to_utf8(
$punycode,
IDNA_DEFAULT,
INTL_IDNA_VARIANT_UTS46,
$idnaInfo
);
if ($unicode !== false) {
echo 'Ergebnis: ' . $unicode . PHP_EOL;
echo 'Transitional Different: ' . ($idnaInfo['isTransitionalDifferent'] ? 'ja' : 'nein') . PHP_EOL;
echo 'Fehler-Bitmask: ' . $idnaInfo['errors'] . PHP_EOL;
} else {
echo 'Fehler bei der Konvertierung.' . PHP_EOL;
echo 'Fehler-Bitmask: ' . $idnaInfo['errors'] . PHP_EOL;
}
Domainliste aus Punycode für die Anzeige aufbereiten
<?php
$domains = [
'xn--bcher-kva.de',
'xn--fiq228c.xn--fiqz9s',
'example.com',
];
foreach ($domains as $domain) {
$readable = idn_to_utf8($domain, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
echo ($readable !== false ? $readable : $domain) . PHP_EOL;
}
// Wichtig · Fallstricke
Veraltete Variante: INTL_IDNA_VARIANT_2003 ist seit PHP 7.2 als deprecated markiert und wurde in PHP 8.0 entfernt. Neuer Code sollte ausschließlich INTL_IDNA_VARIANT_UTS46 verwenden.
Abhängigkeit: Die Funktion setzt die Intl-Erweiterung (ext-intl) voraus. Ist diese nicht aktiviert, führt der Aufruf zu einem fatalen Fehler. Die Verfügbarkeit kann mit function_exists('idn_to_utf8') geprüft werden.
Sicherheitshinweis: Unicode-Domainnamen können für Homograph-Angriffe missbraucht werden (z. B. ähnlich aussehende Zeichen aus verschiedenen Zeichensätzen). Für sicherheitskritische Anwendungen (Phishing-Erkennung, Linkvalidierung) sollte die konvertierte Form sorgfältig geprüft und ggf. die errors-Bitmask in $idna_info ausgewertet werden.