Php cyrillic domain to punycode

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Convert domain names between UTF-8 and ASCII (punycode) notation

License

mabrahamde/php-idna-converter

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Читайте также:  Где header php вордпресс

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

mabrahamde/php-idna-converter is a fork of phlyLabs’ pure PHP IDNA Converter. It converts internationalized domain names between UTF-8 and ASCII (punycode) notation.

Unlike the original mabrahamde/php-idna-converter is available on packagist.org.

If you have installed PHP >= 5.3, PECL intl >= 1.0.2, PECL idn >= 0.1. You can rely on the PHP IDN functions.

Add the package to your composer.json file:

This library is used exactly as the original. The original documentation is available at src/ReadMe.txt and src/example.php .

The following example describes basic usage.

 2008)); echo $idn->encode('lübeck.de'); // prints 'xn--lbeck-kva.de' echo $idn->decode('xn--lbeck-kva.de') // prints 'lübeck.de' ?> 

Do you have any questions or suggestions? Feel free to contact me at dev ( at ) mabraham.de .

About

Convert domain names between UTF-8 and ASCII (punycode) notation

Источник

Кодирование и декодирование кириллических (в зоне .РФ) доменов с помощью Punycode

Домены в зоне .РФ появились сравнительно недавно и уже успели превысить отметку в несколько сотен тысяч регистраций.

Домены в этой зоне предпочтительно относятся к России и пишутся исключительно на кириллице (на русском языке).

Признаюсь честно – я не сторонник этих доменов и русских названий страниц сайта в целом по многим причинам, но Интернет есть Интернет и ничего тут не поделаешь.

Сегодня я познакомлю вас с PHP-классом «Punycode». С помощью этого класса происходит конвертация Unicode-символов в ACE-последовательности. Нам эти все умные понятия не так важны, как важен тот факт, что при разработке своего модуля, например, какого-нибудь парсера, при указании ссылки типа:

мы можем не получить никакого результата. А вот если мы преобразуем этот домен в вид ACE, который, кстати говоря, выглядит так:

 http://xn-----8kc8acomc3adj5j.xn--p1ai

то вполне получим работоспособный скрипт. Вообще, то, где это может вам потребоваться, вы определяете сами, я лишь предоставляю сам класс и инструкцию по работе с ним.

Кодирование кириллических доменов с помощью Punycode

1. Первым делом скачиваем класс в конце статьи и загружаем к себе на хостинг.

2. Далее подключаем его к вашему скрипту (в самый верх) таким образом:

 require_once("idna_convert.class.php");

3. Осуществляем кодирование на примере вышеуказанного домена:

 $domain = "это-мой-сайт.рф"; $converter = new idna_convert(); $encoded_domain = $converter->encode($domain); echo $encoded_domain; // Вернет xn-----8kc8acomc3adj5j.xn--p1ai

Декодирование кириллических доменов с помощью Punycode

Если вам покажут домен вида:

не думаю, что вы сразу сможете понять, что это за адрес на кириллице (пока не перейдете на него, конечно). Чтобы расшифровать обратно этот домен в читаемый вид, делаем следующее.

Первые два шага вы повторяете в точности из описания кодирования, а вот уже третий пункт будет выглядеть следующим образом:

 $domain = "xn-----8kc8acomc3adj5j.xn--p1ai"; $converter = new idna_convert(); $decode_domain = $converter->decode($domain); echo $decode_domain; // Вернет это-мой-сайт.рф

Это все, что вам нужно знать о классе Punycode. Если остались вопросы или возникли трудности – пишите, постараюсь помочь.

Источник

Преобразование punycode в PHP

Преобразование punycode в PHP

Punycode – это специальная кодировка, используется для преобразования символов Unicode в ASCII для кодирования интернационализированных доменных имен (IDN). В PHP есть функции для преобразования:

echo idn_to_ascii('домен.рф'); // xn--d1acufc.xn--p1ai echo idn_to_utf8('xn--d1acufc.xn--p1ai'); // домен.рф
echo idn_to_ascii('http://домен.рф/category'); // xn--http://-5ggj3emj.xn--/category-k3h8b

Чтобы перекодировать домен в ссылке, нужно разбирать URL с помощью parse_url, сделать преобразование и собрать обратно.

function punycode_encode($url) < $parts = parse_url($url); $out = ''; if (!empty($parts['scheme'])) $out .= $parts['scheme'] . ':'; if (!empty($parts['host'])) $out .= '//'; if (!empty($parts['user'])) $out .= $parts['user']; if (!empty($parts['pass'])) $out .= ':' . $parts['pass']; if (!empty($parts['user'])) $out .= '@'; if (!empty($parts['host'])) $out .= idn_to_ascii($parts['host']); if (!empty($parts['port'])) $out .= ':' . $parts['port']; if (!empty($parts['path'])) $out .= $parts['path']; if (!empty($parts['query'])) $out .= '?' . $parts['query']; if (!empty($parts['fragment'])) $out .= '#' . $parts['fragment']; return $out; >echo punycode_encode('http://домен.рф/category'); // http://xn--d1acufc.xn--p1ai/category

Обратный перевод

function punycode_decode($url) < $parts = parse_url($url); $out = ''; if (!empty($parts['scheme'])) $out .= $parts['scheme'] . ':'; if (!empty($parts['host'])) $out .= '//'; if (!empty($parts['user'])) $out .= $parts['user']; if (!empty($parts['pass'])) $out .= ':' . $parts['pass']; if (!empty($parts['user'])) $out .= '@'; if (!empty($parts['host'])) $out .= idn_to_utf8($parts['host']); if (!empty($parts['port'])) $out .= ':' . $parts['port']; if (!empty($parts['path'])) $out .= $parts['path']; if (!empty($parts['query'])) $out .= '?' . $parts['query']; if (!empty($parts['fragment'])) $out .= '#' . $parts['fragment']; return $out; >echo punycode_decode('http://xn--d1acufc.xn--p1ai/category'); // http://домен.рф/category

Источник

Декодировать кириллический домен — punycode в php

С появлением кириллических доменов на русском языке возникла проблема их «отображения» в директориях, url запросах и других областях, где требуется использовать адреса сайтов.

Например, домен яндекс.рф в punycode должен выглядеть как: xn--d1acpjx3f.xn--p1ai. Согласитесь, выглядит не очень красиво. Но здесь ничего не поделаешь, так как линукс хостинги должны записывать названия директорий-доменов в латинице. Именно поэтому, если мы открываем фтп к корню русскоязычного сайта, то его домен будет в непонятных символах: xn--d1acpjx3f.xn--p1ai.

Рассмотрим библиотеку, которая сможет автоматически перевести любой русскоязычный домен в punycode на php и обратно. Для этого идеально подойдет idna_convert.class.php. Скачать его вы можете ниже.

Приведу рабочий пример, как пользоваться этим классом, он не раз меня выручал при создании программ:

header(‘Content-Type: text/html; charset=utf-8’);
include(‘idna_convert.class.php’);

//кодер/декодер домена
function coderurl($url) $idn = new idna_convert(array(‘idn_version’=>2008));
$url=(stripos($url, ‘xn--‘)!==false) ? $idn->decode($url) : $idn->encode($url);
echo $url;
>
?>

Эта функция позволяет приводить домены в понятный вид. Она работает как в прямом, так и в обратном преобразовании. Это означает, что если вы пропустите через нее нормальный домен в латинских символах, то на выходе его и получите, а если кириллический, функция преобразует его в punycode. Примеры запросов с результами:

coderurl(‘ребусто.рф’); // ребусто.рф -> xn--90ah2afhgf.xn--p1ai
coderurl(‘xn--90ah2afhgf.xn--p1ai’); // xn--90ah2afhgf.xn--p1ai -> ребусто.рф
coderurl(‘ya.ru’); // ya.ru -> ya.ru
?>

Принцип работы функции основан на том, что все кириллические домены начинаются с xn-- — по этим символам мы и делаем проверка, что пришло на вход функции. За счет coderurl() я легко преобразую домены в punycode и храню их в таком виде в БД. А если их надо извлечь для чтения пользователям, то преобразую обратно за счет этой же функции.

Источник

idn_to_utf8

Эта функция преобразует доменные имена из формата IDNA ASCII в Unicode, в кодировке UTF-8.

Список параметров

Доменное имя в формате IDNA ASCII.

Опции преобразования — комбинация констант IDNA_* (кроме констант IDNA_ERROR_*).

INTL_IDNA_VARIANT_2003 (объявлена устаревшей начиная с PHP 7.2.0) для IDNA 2003 или INTL_IDNA_VARIANT_UTS46 (доступна только с ICU 4.6) для UTS #46.

Этот параметр используется только если используется INTL_IDNA_VARIANT_UTS46 в variant . В этом случае он будет заполнен массивом с ключами ‘result’ , возможными ошибочными результатами преобразования, ‘isTransitionalDifferent’ , логическое выражение означает изменило или могло бы изменить результат при использовании сквозного механизма UTS #46, и ‘errors’ , содержащими целочисленное представление битовой маски из констант IDNA_ERROR_*.

Возвращаемые значения

Доменное имя в Unicode, в кодировке UTF-8 или false в случае возникновения ошибки.

Список изменений

Версия Описание
7.4.0 Теперь значение по умолчанию variant изменено на INTL_IDNA_VARIANT_UTS46 вместо устаревшей константы INTL_IDNA_VARIANT_2003 .
7.2.0 INTL_IDNA_VARIANT_2003 объявлена устаревшей, вместо неё используйте INTL_IDNA_VARIANT_UTS46 .

Примеры

Пример #1 Пример использования idn_to_utf8()

echo idn_to_utf8 ( ‘xn--tst-qla.de’ );

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 1 note

// 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 return ord ( $cp ) — ord ( ‘a’ );
elseif ( $cp >= ‘0’ && $cp 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 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’ ]);
?>

Источник

Оцените статью