С появлением кириллических доменов на русском языке возникла проблема их "отображения" в директориях, url запросах и других областях, где требуется использовать адреса сайтов.
Например, домен яндекс.рф в punycode должен выглядеть как: xn--d1acpjx3f.xn--p1ai. Согласитесь, выглядит не очень красиво. Но здесь ничего не поделаешь, так как линукс хостинги должны записывать названия директорий-доменов в латинице. Именно поэтому, если мы открываем фтп к корню русскоязычного сайта, то его домен будет в непонятных символах: xn--d1acpjx3f.xn--p1ai.
Рассмотрим библиотеку, которая сможет автоматически перевести любой русскоязычный домен в punycode на php и обратно. Для этого идеально подойдет idna_convert.class.php. Скачать его вы можете ниже.
Приведу рабочий пример, как пользоваться этим классом, он не раз меня выручал при создании программ:
<?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. Примеры запросов с результами:
<?php
coderurl('ребусто.рф'); // ребусто.рф -> xn--90ah2afhgf.xn--p1ai
coderurl('xn--90ah2afhgf.xn--p1ai'); // xn--90ah2afhgf.xn--p1ai -> ребусто.рф
coderurl('ya.ru'); // ya.ru -> ya.ru
?>
Принцип работы функции основан на том, что все кириллические домены начинаются с xn-- - по этим символам мы и делаем проверка, что пришло на вход функции. За счет coderurl() я легко преобразую домены в punycode и храню их в таком виде в БД. А если их надо извлечь для чтения пользователям, то преобразую обратно за счет этой же функции.