Start · Sprachen · PHP · Referenz · idn_to_utf8

idn_to_utf8

Funktion

Konvertiert einen internationalisierten Domainnamen (IDN) von der IDNA-ASCII-Codierung (Punycode) zurück in eine Unicode-Darstellung.

seit PHP 5.3.0 Kategorie: string

Signatur

idn_to_utf8(string $domain, int $flags = IDNA_DEFAULT, int $variant = INTL_IDNA_VARIANT_UTS46, array &$idna_info = []): string|false

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

Typ
string|false
Beschreibung
Gibt den konvertierten Domainnamen als UTF-8-Zeichenkette zurück. Bei einem Fehler (z. B. ungültiger Eingabewert) wird 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;
}
Unicode-Domainname: bücher.example.de

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;
}
Ergebnis: ☁.example.com Transitional Different: nein Fehler-Bitmask: 0

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;
}
bücher.de 中文.中文 example.com

// 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.