idn_to_utf8

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.2, PECL idn >= 0.1)

idn_to_utf8Convertit le nom de domaine IDNA ASCII en Unicode

Description

Style procédural

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

Cette fonction convertit le nom de domaine au format IDNA ASCII-compatible en Unicode, encodé en UTF-8.

Liste de paramètres

domain

Domaine à convertir depuis le format IDNA ASCII-compatible.

flags

Options de conversion - une combinaison des constantes IDNA_* (sauf les constantes IDNA_ERROR_*).

variant

Soit INTL_IDNA_VARIANT_2003 (obsolète à partir de PHP 7.2.0) pour IDNA 2003, soit INTL_IDNA_VARIANT_UTS46 (seulement disponible à partir de ICU 4.6) pour UTS #46.

idna_info

Ce paramètre ne peut être utilisé que si la constante INTL_IDNA_VARIANT_UTS46 a été utilisée comme paramètre pour variant. Dans ce cas, ce paramètre sera rempli par un tableau dont la clé 'result' contiendra le résultat de la transformation, la clé 'isTransitionalDifferent' contiendra un booléen indiquant si l'utilisation du mécanisme transitionnel UTS #46 a altéré ou non le résultat, et la clé 'errors' contiendra un int représentant un jeu de bits de constantes d'erreurs IDNA_ERROR_*.

Valeurs de retour

Nom de domaine en Unicode, encodé UTF-8. ou false si une erreur survient

Historique

Version Description
7.4.0 La valeur par défaut du paramètre variant est maintenant INTL_IDNA_VARIANT_UTS46 à la place de la constante INTL_IDNA_VARIANT_2003 déprécié.
7.2.0 INTL_IDNA_VARIANT_2003 a été déprécie; utiliser INTL_IDNA_VARIANT_UTS46 à la place.

Exemples

Exemple #1 Exemple avec idn_to_utf8()

<?php

echo idn_to_utf8('xn--tst-qla.de');

?>

L'exemple ci-dessus va afficher :

täst.de

Voir aussi

add a note

User Contributed Notes 1 note

up
14
kushik.com
12 years ago
<?php// for those who has PHP older than version 5.3class IDN {    // adapt bias for punycode algorithm    private static function punyAdapt(        $delta,        $numpoints,        $firsttime    ) {        $delta = $firsttime ? $delta / 700 : $delta / 2;         $delta += $delta / $numpoints;        for ($k = 0; $delta > 455; $k += 36)            $delta = intval($delta / 35);        return $k + (36 * $delta) / ($delta + 38);    }     // translate character to punycode number    private static function decodeDigit($cp) {        $cp = strtolower($cp);        if ($cp >= 'a' && $cp <= 'z')            return ord($cp) - ord('a');        elseif ($cp >= '0' && $cp <= '9')            return ord($cp) - ord('0')+26;    }     // make utf8 string from unicode codepoint number    private static function utf8($cp) {        if ($cp < 128) return chr($cp);        if ($cp < 2048)             return chr(192+($cp >> 6)).chr(128+($cp & 63));        if ($cp < 65536) return             chr(224+($cp >> 12)).            chr(128+(($cp >> 6) & 63)).            chr(128+($cp & 63));        if ($cp < 2097152) return             chr(240+($cp >> 18)).            chr(128+(($cp >> 12) & 63)).            chr(128+(($cp >> 6) & 63)).            chr(128+($cp & 63));        // it should never get here     }     // main decoding function    private static function decodePart($input) {        if (substr($input,0,4) != "xn--") // prefix check...            return $input;        $input = substr($input,4); // discard prefix        $a = explode("-",$input);        if (count($a) > 1) {            $input = str_split(array_pop($a));            $output = str_split(implode("-",$a));        } else {            $output = array();            $input = str_split($input);        }        $n = 128; $i = 0; $bias = 72; // init punycode vars        while (!empty($input)) {            $oldi = $i;            $w = 1;            for ($k = 36;;$k += 36) {                $digit = IDN::decodeDigit(array_shift($input));                $i += $digit * $w;                if ($k <= $bias) $t = 1;                elseif ($k >= $bias + 26) $t = 26;                else $t = $k - $bias;                if ($digit < $t) break;                $w *= intval(36 - $t);            }            $bias = IDN::punyAdapt(                $i-$oldi,                count($output)+1,                $oldi == 0            );            $n += intval($i / (count($output) + 1));            $i %= count($output) + 1;            array_splice($output,$i,0,array(IDN::utf8($n)));            $i++;        }        return implode("",$output);    }     public static function decodeIDN($name) {        // split it, parse it and put it back together        return             implode(                ".",                array_map("IDN::decodePart",explode(".",$name))            );    } }echo IDN::decodeIDN($_SERVER['HTTP_HOST']);?>
To Top