PHP 8.5.0 Alpha 2 available for testing

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.3
class 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