PHP Conference Fukuoka 2025

idn_to_utf8

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

idn_to_utf8Convierte el nombre de dominio IDNA ASCII a Unicode

Descripción

Estilo procedimental

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

Esta función convierte el nombre de dominio en formato IDNA ASCII-compatible a Unicode, codificado en UTF-8.

Parámetros

domain

Dominio a convertir desde el formato IDNA ASCII-compatible.

flags

Opciones de conversión - una combinación de las constantes IDNA_* (excepto las constantes IDNA_ERROR_*).

variant

Puede ser INTL_IDNA_VARIANT_2003 (obsoleto a partir de PHP 7.2.0) para IDNA 2003, o INTL_IDNA_VARIANT_UTS46 (solo disponible a partir de ICU 4.6) para UTS #46.

idna_info

Este parámetro solo puede ser utilizado si la constante INTL_IDNA_VARIANT_UTS46 ha sido utilizada como parámetro para variant. En este caso, este parámetro será rellenado por un array donde la clave 'result' contendrá el resultado de la transformación, la clave 'isTransitionalDifferent' contendrá un booleano indicando si el uso del mecanismo transicional UTS #46 ha alterado o no el resultado, y la clave 'errors' contendrá un int representando un juego de bits de constantes IDNA_ERROR_*.

Valores devueltos

Nombre de dominio en Unicode, codificado UTF-8. o false si ocurre un error

Historial de cambios

Versión Descripción
7.4.0 El valor por defecto del parámetro variant es ahora INTL_IDNA_VARIANT_UTS46 en lugar de la constante INTL_IDNA_VARIANT_2003 deprecada.
7.2.0 INTL_IDNA_VARIANT_2003 ha sido deprecado; utilizar INTL_IDNA_VARIANT_UTS46 en su lugar.

Ejemplos

Ejemplo #1 Ejemplo con idn_to_utf8()

<?php

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

?>

El ejemplo anterior mostrará :

täst.de

Ver también

  • idn_to_ascii() - Convierte un nombre de dominio al formato IDNA ASCII

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