За последние 24 часа нас посетили 22518 программистов и 1001 робот. Сейчас ищут 759 программистов ...

Кодировка-раскодировка Punycode

Тема в разделе "PHP для новичков", создана пользователем блудный сын, 13 июл 2008.

  1. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Знаю, что кириллические символы в адресе url перед отправкой браузером перекодируются в кодировку Punycode. Подскажите, а как скриптом осуществить эти перекодирования? Например, если скриптом нужно подключиться к хосту http://пиво.com как этот урл перекодировать в понятный скрипту? И наоборот, если к моему хосту передали нечто http://xn--abrakadabra.com как это перевести на человеческий язык?
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
  3. Anonymous

    Anonymous Guest

    На phpclasses.org был рабочий, я его тестил.
     
  4. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    У меня тоже :(
     
  5. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Вот, нашел, но как его в рабочий вариант превратить?
    PHP:
    1. <?php
    2. $encoded = '';
    3. $decoded = '';
    4. $add = '';
    5. header('Content-Type: text/html; charset=UTF-8');
    6. require_once('idna_convert.class.php');
    7. $IDN = new idna_convert();
    8. if (isset($_REQUEST['encode'])) {
    9.     $decoded = isset($_REQUEST['decoded']) ? stripslashes($_REQUEST['decoded']) : '';
    10.     $encoded = $IDN->encode($decoded);
    11. }
    12. if (isset($_REQUEST['decode'])) {
    13.     $encoded = isset($_REQUEST['encoded']) ? stripslashes($_REQUEST['encoded']) : '';
    14.     $decoded = $IDN->decode($encoded);
    15. }
    16. if (isset($_REQUEST['lang'])) {
    17.     if ('de' == $_REQUEST['lang'] || 'en' == $_REQUEST['lang']) $lang = $_REQUEST['lang'];
    18.     $add .= '<input type="hidden" name="lang" value="'.$_REQUEST['lang'].'" />'."\n";
    19. } else {
    20.     $lang = 'en';
    21. }
    22. ?>
    23. <!DOCTYPE html public "-//W3C//DTD HTML 4.01 Transitional//EN">
    24. <html>
    25. <head>
    26. <title>phlyLabs Punycode Converter</title>
    27. <meta name="author" content="phlyLabs">
    28. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    29. <style type="text/css">
    30. body {
    31.     color:black;
    32.     background:white;
    33.     font-size:10pt;
    34.     font-family:Verdana, Helvetica, Sans-Serif;
    35. }
    36.  
    37. body, form {
    38.     margin:0px;
    39. }
    40.  
    41. form {
    42.     display:inline;
    43. }
    44.  
    45. input {
    46.     font-size:8pt;
    47.     font-family:Verdana, Helvetica, Sans-Serif;
    48. }
    49.  
    50. #mitte {
    51.     text-align:center;
    52.     vertical-align:middle;
    53. }
    54.  
    55. #round {
    56.     background-color:rgb(230, 230, 240);
    57.     border:1px solid black;
    58.     text-align:center;
    59.     vertical-align:middle;
    60.     padding:10px;
    61. }
    62.  
    63. .thead {
    64.     font-size:9pt;
    65.     font-weight:bold;
    66. }
    67.  
    68. #copy {
    69.     font-size:8pt;
    70.     color:rgb(60, 60, 80);
    71. }
    72.  
    73. #subhead {
    74.     font-size:8pt;
    75. }
    76.  
    77. #bla {
    78.     font-size:8pt;
    79.     text-align:left;
    80. }
    81. </style>
    82. </head>
    83. <body>
    84. <table width="768" border="0" cellpadding="50" cellspacing="0">
    85. <tr>
    86. <td id="mitte">
    87.   <div id="round">
    88.    <strong>phlyLabs` pure PHP IDNA Converter</strong><br />
    89.    <span id="subhead">
    90.     See <a href="http://faqs.org/rfcs/rfc3490.html" title="IDNA" target="_blank">RFC3490</a>,
    91.     <a href="http://faqs.org/rfcs/rfc3491.html" title="Nameprep, a Stringprep profile" target="_blank">RFC3491</a>,
    92.     <a href="http://faqs.org/rfcs/rfc3492.html" title="Punycode" target="_blank">RFC3492</a> and
    93.     <a href="http://faqs.org/rfcs/rfc3454.html" title="Stringprep" target="_blank">RFC3454</a><br />
    94.    </span>
    95.    <br />
    96.    <div id="bla"><?php if ($lang == 'de') { ?>
    97.    Dieser Konverter erlaubt die Ubersetzung von Domainnamen zwischen der Punycode- und der
    98.    Unicode-Schreibweise.<br />
    99.    Geben Sie einfach den Domainnamen im entsprechend bezeichneten Feld ein und klicken Sie dann auf den darunter
    100.    liegenden Button. Sie konnen einfache Domainnamen, komplette URLs (wie [url=http://jurgen-muller.de]http://jurgen-muller.de[/url])
    101.    oder Emailadressen eingeben.<br />
    102.    <br />
    103.    Stellen Sie aber sicher, dass Ihr Browser den Zeichensatz <strong>UTF-8</strong> unterstutzt.<br />
    104.    <br />
    105.    Wenn Sie Interesse an der zugrundeliegenden PHP-Klasse haben, konnen Sie diese
    106.    <a href="http://phlymail.de/de/downloads/idna/download/">hier herunterladen</a>.<br />
    107.    <br />
    108.    Diese Klasse wird ohne Garantie ihrer Funktionstuchtigkeit bereit gestellt. Nutzung auf eigene Gefahr.<br />
    109.    Um sicher zu stellen, dass eine Zeichenkette korrekt umgewandelt wurde, sollten Sie diese immer zuruckwandeln
    110.    und das Ergebnis mit Ihrer ursprunglichen Eingabe vergleichen.<br />
    111.    <br />
    112.    Fehler und Probleme konnen Sie gern an <a href="mailto:team@phlymail.de">team@phlymail.de</a> senden.<br />
    113.    <?php } else { ?>
    114.    This converter allows you to transfer domain names between the encoded (Punycode) notation
    115.    and the decoded (UTF-8) notation.<br />
    116.    Just enter the domain name in the respective field and click on the button right below it to have
    117.    it converted. Please note, that you might even enter complete domain names (like j&#xFC;rgen-m&#xFC;ller.de)
    118.    or a email addresses.<br />
    119.    <br />
    120.    Make sure, that your browser is capable of the <strong>UTF-8</strong> character encoding.<br />
    121.    <br />
    122.    For those of you interested in the PHP source of the underlying class, you might
    123.    <a href="http://phlymail.de/en/downloads/idna/download/">download it here</a>.<br />
    124.    <br />
    125.    Please be aware, that this class is provided as is and without any liability. Use at your own risk.<br />
    126.    To ensure, that a certain string has been converted correctly, you should convert it both ways and compare the
    127.    results.<br />
    128.    <br />
    129.    Please feel free to report bugs and problems to: <a href="mailto:team@phlymail.de">team@phlymail.de</a>.<br />
    130.    <?php } ?>
    131.    <br />
    132.    </div>
    133.    <table border="0" cellpadding="2" cellspacing="2" align="center">
    134.    <tr>
    135.     <td class="thead" align="left">Original (Unicode)</td>
    136.     <td class="thead" align="right">Punycode (ACE)</td>
    137.    </tr>
    138.    <tr>
    139.     <td align="right">
    140.      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
    141.       <input type="text" name="decoded" value="<?php echo htmlentities($decoded, null, 'UTF-8'); ?>" size="48" maxlength="255" /><br />
    142.       <input type="submit" name="encode" value="Encode &gt;&gt;" /><?php echo $add; ?>
    143.      </form>
    144.     </td>
    145.     <td align="left">
    146.      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
    147.       <input type="text" name="encoded" value="<?php echo htmlentities($encoded, null, 'UTF-8'); ?>" size="48" maxlength="255" /><br />
    148.       <input type="submit" name="decode" value="&lt;&lt; Decode" /><?php echo $add; ?>
    149.      </form>
    150.     </td>
    151.    </tr>
    152.    </table><br />
    153.    <span id="copy">Version used: 0.5.1; (c) <a href="http://phlylabs.de">phlyLabs</a> 2004-2007</span>
    154. </div>
    155. </td>
    156. </tr>
    157. </table>
    158. </body>
    159. </html>
     
  6. Anonymous

    Anonymous Guest

    Запихнуть в файл и выполнить?
     
  7. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Думаю, достаточно этого кода и файла idna_convert.class.php:
    PHP:
    1. <?php
    2.  require_once('idna_convert.class.php');
    3.   $IDN = new idna_convert();
    4. ?>
    Дальше, кодируем:
    PHP:
    1. <?php
    2.   $encoded = $IDN->encode($decoded);
    3. ?>
    или раскодируем:
    PHP:
    1. <?php
    2.   $decoded = $IDN->decode($encoded);
    3. ?>
     
  8. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Переименовать
    Код (Text):
    1. 6 require_once('punycode.php');
    догадался. Но все равно
    Fatal error: Class 'idna_convert' not found in С:\test\www\whois\proba\punycode.php on line 7
     
  9. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    А где его взять?
     
  10. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
  11. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    там чтобы скачать класс нужно зарегистрироваться?
     
  12. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
  13. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Спасибо! Заработало!

    Мда... Серьезный класс... 2701 строка...

    А подскажите, сколько разных символов понимает punycode?
     
  14. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
  15. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    mclaud, не нашел :(
    Вот смотрите: ©.com перекодирует в xn--gba.com Т.е. сайт ©.com может существовать (более того, уже существуе), а вот @.com не перекодирует. Вот поэтому и вопрос, какие символы доступны в адресной строке, а какие нет. Не наугад ведь поверять?
     
  16. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Думаю надо сесть и внимательно (а не за 15 минут) перечитать спецификацию и заодно разобраться в принципах работы класса на 2701 строку, и я более чем уверен, что ответ найдется! Гарантирую! Я сам так всегда поступаю!
     
  17. Anonymous

    Anonymous Guest

    это ж думать надо. ) Не уверен, но скорее всего все символы с кодом 33 > ASCII >127 перекодировываются.
     
  18. Anonymous

    Anonymous Guest

    Сегодня в процессе настройки сервера увидел новый пакетик:
    Код (Text):
    1. root@nicecode:~# apt-cache show php5-idn
    2. Package: php5-idn
    3. Priority: optional
    4. Section: universe/web
    5. Installed-Size: 84
    6. Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
    7. Original-Maintainer: Turbo Fredriksson <turbo@debian.org>
    8. Architecture: amd64
    9. Source: php-idn
    10. Version: 1.2b-5
    11. Depends: libc6 (>= 2.7-1), libidn11 (>= 0.5.18), phpapi-20060613
    12. Filename: pool/universe/p/php-idn/php5-idn_1.2b-5_amd64.deb
    13. Size: 13096
    14. MD5sum: f7ce4778d28c9a56ec1679d97f1625a5
    15. SHA1: 58ad0ad2458053bed6d093889ac5f7c9e6836bbb
    16. SHA256: e2c0dd29d1c22a37dc2fab00b29b431f8d024f4f99c10014ca545e529d5e3d13
    17. Description: PHP API for the IDNA library
    18.  This is the PHP(5) API for the GNU LibIDN software. It's intention is
    19.  to have international characters in the DNS system.
    20.  See php-idn.bayour.com for more information.
    21. Bugs: mailto:ubuntu-users@lists.ubuntu.com
    22. Origin: Ubuntu
    23.  
    24. root@nicecode:~#
    Так-то? В пекле нашел только очень старый пакет.
     
  19. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Похоже их гораздо больше, чем 127-33=94 т.к. перекодирует даже китайские иероглифы, вот например xn--euz.com (竡). Наверно их число равно 256*256.
     
  20. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    В PHP такого ведь нет? Иначе зачем было класс писать?
     
  21. Anonymous

    Anonymous Guest

    У меня - есть... :)
    Оговорился, перекодироваются ВСЕ, кроме