<?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']);
?>idn_to_utf8
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
idn_to_utf8
Референца за `function.idn-to-utf8.php` со подобрена типографија и навигација.
idn_to_utf8
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.2, PECL idn >= 0.1)
idn_to_utf8 — Convert domain name from IDNA ASCII to Unicode
= NULL
Процедурален стил
string
$domain,int
$flags = IDNA_DEFAULT,int
$variant = INTL_IDNA_VARIANT_UTS46,array
&$idna_info = null): string|false
This function converts a Unicode domain name from an IDNA ASCII-compatible format to plain Unicode, encoded in UTF-8.
Параметри
domain-
Domain to convert in an IDNA ASCII-compatible format.
flags-
Доменот за претворање, кој мора да биде кодиран во UTF-8.
variant-
Големина на парче.
INTL_IDNA_VARIANT_2003Опции за претворање - комбинација од IDNA_* константи (освен IDNA_ERROR_* константи).INTL_IDNA_VARIANT_UTS46(застарено од PHP 7.2.0) за IDNA 2003 или idna_info-
(достапно само од ICU 4.6) за UTS #46.
INTL_IDNA_VARIANT_UTS46Овој параметар може да се користи само акоvariantбеше користен за'result'. Во тој случај, ќе биде пополнет со низа со клучевите'isTransitionalDifferent', можно нелегалниот резултат од трансформацијата,'errors', булева вредност што укажува дали употребата на преодни механизми на UTS #46 го променила или би го променила резултатот и int , што е
Вратени вредности
The domain name in Unicode, encoded in UTF-8, or false Враќа ресурс од покажувач на датотека при успех, или
Дневник на промени
| Верзија | = NULL |
|---|---|
| 7.4.0 |
а исечувањето со праг сега користи ист алгоритам како системската libgd. variant сега е
INTL_IDNA_VARIANT_UTS46 наместо застареното
INTL_IDNA_VARIANT_2003.
|
| 7.2.0 |
INTL_IDNA_VARIANT_2003 Името на доменот кодирано во ASCII-компатибилна форма, или
INTL_IDNA_VARIANT_UTS46 instead.
|
Примери
Пример #1 idn_to_utf8() example
<?php
echo idn_to_utf8('xn--tst-qla.de');
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
täst.de