Dernière mise à jour: mer 3 fév 2010

idn_decode()

(PHP 5)

Décode une chaine encodée en Punnycode.

idn_decode() retourne la chaîne input décodée selon l'algorithme défini dans la RFC 3492.

Cette fonction est expérimentale. Bien qu'aucun problème n'ai été constaté à ce jour, il n'est pas impossible qu'elle puisse fournir des résultats inattendus.

Source

<?php

function idn_decode( $input , $encoding = 'UTF-8' )
{
	// Diverses "constantes"
	$cPrefix = 'xn--';
	$cBase = 36;
	$cTmin = 1;
	$cTmax = 26;
	$cSkew = 38;
	$cDamp = 700;
	$cInitial_bias = 72;
	$cInitial_n    = 0x80;
	
	$cDigits = 'abcdefghijklmnopqrstuvwxyz0123456789';
	
	
	// Diverses fonctions
	$fAdapt = create_function('$delta, $numpoints, $firstime',
	'
		$cBase = '. $cBase .';
		$cTmin = '. $cTmin .';
		$cTmax = '. $cTmax .';
		$cSkew = '. $cSkew .';
		$cDamp = '. $cDamp .';
		
		if($firstime)
			$delta = $delta / $cDamp;
		else
			$delta = $delta / 2;
		$delta += $delta / $numpoints;
		$k = 0;
		while( $delta > (($cBase - $cTmin) * $cTmax) / 2 )
		{
			$delta = $delta / ($cBase - $cTmin);
			$k += $cBase;
		}
		return $k + ($cBase - $cTmin + 1) * $delta / ($delta + $cSkew);
	');
	
	$fDecodeDigit = create_function('$digit',
	'
		$cDigits = "'. $cDigits .'";
		return strpos($cDigits, strtolower($digit));
	');
	
	$fUnichr = create_function('$unicode, $encoding="UTF-8"',
	'
		$unicode = intval($unicode);
		return mb_convert_encoding("&#{$unicode};", $encoding, "HTML-ENTITIES");
	');
	
	
	// C'est parti !
	$output = $input;
	
	preg_match_all(
		'`('. preg_quote($cPrefix,'`') .')(([-a-z0-9]+)-)?([a-z0-9]+)`',
		$input,
		$matches
	);
	
	for($mi=0; $mi<count($matches[0]); $mi++)
	{
		// Boucle sur les différentes chaines encodées
		$encoded = $matches[0][$mi];
		if( strlen($matches[3][$mi]) )
			$decoded = array_map('ord', str_split($matches[3][$mi]));
		else
			$decoded = array();
		$code = $matches[4][$mi];
		
		$encoded_lenght = strlen($encoded);
		$decoded_lenght = count($decoded);
		$code_length    = strlen($code);
		
		$n = $cInitial_n;
		$i = 0;
		$bias = $cInitial_bias;
		
		for($iCode=0; $iCode<$code_length; ++$decoded_lenght)
		{
			$oldi = $i;
			$w = 1;
			for ($k = $cBase; ; $k += $cBase)
			{
				$digit = $fDecodeDigit( $code{$iCode} );
				$iCode++;
				$i += $digit * $w;
				
				if( $k <= $bias )
					$t = $cTmin;
				elseif( $k >= $bias + $cTmax )
					$t = $cTmax;
				else
					$t = $k - $bias;
				
				if($digit < $t) break;
				$w = intval($w * ( $cBase - $t));
			}
			
			$bias = $fAdapt($i - $oldi, $decoded_lenght + 1, ($oldi==0));
			$n += intval($i / ($decoded_lenght + 1));
			$i %= ($decoded_lenght + 1);
			
			// Insère le caractère au bon endroit
			array_splice(
				$decoded, $i, count($decoded),
				array_merge(array($n), array_slice($decoded, $i, count($decoded)))
			);
			
			$i++;
		}
		
		$decoded_string = '';
		foreach($decoded as $decoded_char)
			$decoded_string .= $fUnichr($decoded_char, $encoding);
		
		$output = str_replace($encoded, $decoded_string, $output);
	}
	
	return $output;
}

?>

Syntaxe

string idn_decode ( string $input [, string $encoding = 'UTF-8' ] )

Arguments

  1. input - La chaîne encodée.
  2. encoding - Le paramètre encoding est l'encodage des caractères. S'il est omis, l'encodage de caractères UTF-8 sera utilisé.

Valeurs de retour

Retourne la chaîne décodée.

Exemples

Exemple #1 Exemple avec idn_decode()

<?php

$str = "www.xn--pre-nol-2xa6a.net";
$str = idn_decode($str);
echo $str; // www.père-noël.net

?>

Exemple #2 Exemple avec idn_decode()

<?php

$str = "user@xn--champs-lyses-hebd.com";
$str = idn_decode($str, "ISO-8859-1");
echo $str; // user@champs-élysées.com (en ISO)

?>

Voir aussi

Commentaire(s)

Il n'y a aucun commentaire pour cette page.

Poster un commentaire