Знаю, что кириллические символы в адресе url перед отправкой браузером перекодируются в кодировку Punycode. Подскажите, а как скриптом осуществить эти перекодирования? Например, если скриптом нужно подключиться к хосту http://пиво.com как этот урл перекодировать в понятный скрипту? И наоборот, если к моему хосту передали нечто http://xn--abrakadabra.com как это перевести на человеческий язык?
блудный сын http://www.ietf.org/rfc/rfc3492.txt http://pear.php.net/package/Net_IDNA - готовый грушевый класс, но у меня сайт что-то не открывается...
Вот, нашел, но как его в рабочий вариант превратить? PHP: <?php $encoded = ''; $decoded = ''; $add = ''; header('Content-Type: text/html; charset=UTF-8'); require_once('idna_convert.class.php'); $IDN = new idna_convert(); if (isset($_REQUEST['encode'])) { $decoded = isset($_REQUEST['decoded']) ? stripslashes($_REQUEST['decoded']) : ''; $encoded = $IDN->encode($decoded); } if (isset($_REQUEST['decode'])) { $encoded = isset($_REQUEST['encoded']) ? stripslashes($_REQUEST['encoded']) : ''; $decoded = $IDN->decode($encoded); } if (isset($_REQUEST['lang'])) { if ('de' == $_REQUEST['lang'] || 'en' == $_REQUEST['lang']) $lang = $_REQUEST['lang']; $add .= '<input type="hidden" name="lang" value="'.$_REQUEST['lang'].'" />'."\n"; } else { $lang = 'en'; } ?> <!DOCTYPE html public "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>phlyLabs Punycode Converter</title> <meta name="author" content="phlyLabs"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type="text/css"> body { color:black; background:white; font-size:10pt; font-family:Verdana, Helvetica, Sans-Serif; } body, form { margin:0px; } form { display:inline; } input { font-size:8pt; font-family:Verdana, Helvetica, Sans-Serif; } #mitte { text-align:center; vertical-align:middle; } #round { background-color:rgb(230, 230, 240); border:1px solid black; text-align:center; vertical-align:middle; padding:10px; } .thead { font-size:9pt; font-weight:bold; } #copy { font-size:8pt; color:rgb(60, 60, 80); } #subhead { font-size:8pt; } #bla { font-size:8pt; text-align:left; } </style> </head> <body> <table width="768" border="0" cellpadding="50" cellspacing="0"> <tr> <td id="mitte"> <div id="round"> <strong>phlyLabs` pure PHP IDNA Converter</strong><br /> <span id="subhead"> See <a href="http://faqs.org/rfcs/rfc3490.html" title="IDNA" target="_blank">RFC3490</a>, <a href="http://faqs.org/rfcs/rfc3491.html" title="Nameprep, a Stringprep profile" target="_blank">RFC3491</a>, <a href="http://faqs.org/rfcs/rfc3492.html" title="Punycode" target="_blank">RFC3492</a> and <a href="http://faqs.org/rfcs/rfc3454.html" title="Stringprep" target="_blank">RFC3454</a><br /> </span> <br /> <div id="bla"><?php if ($lang == 'de') { ?> Dieser Konverter erlaubt die Ubersetzung von Domainnamen zwischen der Punycode- und der Unicode-Schreibweise.<br /> Geben Sie einfach den Domainnamen im entsprechend bezeichneten Feld ein und klicken Sie dann auf den darunter liegenden Button. Sie konnen einfache Domainnamen, komplette URLs (wie [url=http://jurgen-muller.de]http://jurgen-muller.de[/url]) oder Emailadressen eingeben.<br /> <br /> Stellen Sie aber sicher, dass Ihr Browser den Zeichensatz <strong>UTF-8</strong> unterstutzt.<br /> <br /> Wenn Sie Interesse an der zugrundeliegenden PHP-Klasse haben, konnen Sie diese <a href="http://phlymail.de/de/downloads/idna/download/">hier herunterladen</a>.<br /> <br /> Diese Klasse wird ohne Garantie ihrer Funktionstuchtigkeit bereit gestellt. Nutzung auf eigene Gefahr.<br /> Um sicher zu stellen, dass eine Zeichenkette korrekt umgewandelt wurde, sollten Sie diese immer zuruckwandeln und das Ergebnis mit Ihrer ursprunglichen Eingabe vergleichen.<br /> <br /> Fehler und Probleme konnen Sie gern an <a href="mailto:team@phlymail.de">team@phlymail.de</a> senden.<br /> <?php } else { ?> This converter allows you to transfer domain names between the encoded (Punycode) notation and the decoded (UTF-8) notation.<br /> Just enter the domain name in the respective field and click on the button right below it to have it converted. Please note, that you might even enter complete domain names (like jürgen-müller.de) or a email addresses.<br /> <br /> Make sure, that your browser is capable of the <strong>UTF-8</strong> character encoding.<br /> <br /> For those of you interested in the PHP source of the underlying class, you might <a href="http://phlymail.de/en/downloads/idna/download/">download it here</a>.<br /> <br /> Please be aware, that this class is provided as is and without any liability. Use at your own risk.<br /> To ensure, that a certain string has been converted correctly, you should convert it both ways and compare the results.<br /> <br /> Please feel free to report bugs and problems to: <a href="mailto:team@phlymail.de">team@phlymail.de</a>.<br /> <?php } ?> <br /> </div> <table border="0" cellpadding="2" cellspacing="2" align="center"> <tr> <td class="thead" align="left">Original (Unicode)</td> <td class="thead" align="right">Punycode (ACE)</td> </tr> <tr> <td align="right"> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> <input type="text" name="decoded" value="<?php echo htmlentities($decoded, null, 'UTF-8'); ?>" size="48" maxlength="255" /><br /> <input type="submit" name="encode" value="Encode >>" /><?php echo $add; ?> </form> </td> <td align="left"> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> <input type="text" name="encoded" value="<?php echo htmlentities($encoded, null, 'UTF-8'); ?>" size="48" maxlength="255" /><br /> <input type="submit" name="decode" value="<< Decode" /><?php echo $add; ?> </form> </td> </tr> </table><br /> <span id="copy">Version used: 0.5.1; (c) <a href="http://phlylabs.de">phlyLabs</a> 2004-2007</span> </div> </td> </tr> </table> </body> </html>
Думаю, достаточно этого кода и файла idna_convert.class.php: PHP: <?php require_once('idna_convert.class.php'); $IDN = new idna_convert(); ?> Дальше, кодируем: PHP: <?php $encoded = $IDN->encode($decoded); ?> или раскодируем: PHP: <?php $decoded = $IDN->decode($encoded); ?>
Переименовать Код (Text): 6 require_once('punycode.php'); догадался. Но все равно Fatal error: Class 'idna_convert' not found in С:\test\www\whois\proba\punycode.php on line 7
Ну для начала поискать тут: http://www.google.com.ua/search?q=downl ... .class.php И в первой же строке результата, найти тут: http://www.phpclasses.org/browse/file/5845.html
Спасибо! Заработало! Мда... Серьезный класс... 2701 строка... А подскажите, сколько разных символов понимает punycode?
Не знаю! Если интересно ищи ответ где-то тут: http://www.ietf.org/rfc/rfc3491.txt?number=3491 http://www.ietf.org/rfc/rfc3492.txt?number=3492 http://www.ietf.org/rfc/rfc3454.txt?number=3454
mclaud, не нашел Вот смотрите: ©.com перекодирует в xn--gba.com Т.е. сайт ©.com может существовать (более того, уже существуе), а вот @.com не перекодирует. Вот поэтому и вопрос, какие символы доступны в адресной строке, а какие нет. Не наугад ведь поверять?
Думаю надо сесть и внимательно (а не за 15 минут) перечитать спецификацию и заодно разобраться в принципах работы класса на 2701 строку, и я более чем уверен, что ответ найдется! Гарантирую! Я сам так всегда поступаю!
это ж думать надо. ) Не уверен, но скорее всего все символы с кодом 33 > ASCII >127 перекодировываются.
Сегодня в процессе настройки сервера увидел новый пакетик: Код (Text): root@nicecode:~# apt-cache show php5-idn Package: php5-idn Priority: optional Section: universe/web Installed-Size: 84 Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com> Original-Maintainer: Turbo Fredriksson <turbo@debian.org> Architecture: amd64 Source: php-idn Version: 1.2b-5 Depends: libc6 (>= 2.7-1), libidn11 (>= 0.5.18), phpapi-20060613 Filename: pool/universe/p/php-idn/php5-idn_1.2b-5_amd64.deb Size: 13096 MD5sum: f7ce4778d28c9a56ec1679d97f1625a5 SHA1: 58ad0ad2458053bed6d093889ac5f7c9e6836bbb SHA256: e2c0dd29d1c22a37dc2fab00b29b431f8d024f4f99c10014ca545e529d5e3d13 Description: PHP API for the IDNA library This is the PHP(5) API for the GNU LibIDN software. It's intention is to have international characters in the DNS system. See php-idn.bayour.com for more information. Bugs: mailto:ubuntu-users@lists.ubuntu.com Origin: Ubuntu root@nicecode:~# Так-то? В пекле нашел только очень старый пакет.
Похоже их гораздо больше, чем 127-33=94 т.к. перекодирует даже китайские иероглифы, вот например xn--euz.com (竡). Наверно их число равно 256*256.