The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Как работает Punycode? Алгоритм!!!"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Сеть. проблемы, диагностика)
Изначальное сообщение [ Отслеживать ]

"Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 25-Дек-12, 04:28 
Уже не знаю, где спросить, поэтому попробую здесь, может кто ответит
Купил скрипт конструктор сайтов, но он не поддерживает русские домены.
Спецификацию RFC 3492 я почитал, хотя с ангийским довольно недружен, но тем не менее. Класс для создания Idn доменов я нашел, но как работает так и не понял. Объясните пожалуйста.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 25-Дек-12, 07:01 
> но как работает так и не понял. Объясните пожалуйста.

Браузер ищет первые четыре символа, если это XN-- то это считается пуникодом, и
в таком виде отправляется на DNS сервак, а строку адреса преобразовывает к читаемому виду.
Та же фигня, но обратно, - если в строке появляются локальные UTF коды,
пишет префикс xn--, перекодирует остальную строку и засылает в DNS.
  
https://www.opennet.ru/base/net/rus_dns.txt.html

Грубо говоря, доменов с национальными буками не существует в природе :)
Заплатив мильон баксов за домен секс.рф, в реальности купишь xn--e1aktc.xn--p1ai.

Ответить | Правка | Наверх | Cообщить модератору

2. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 25-Дек-12, 07:59 
>[оверквотинг удален]
> Браузер ищет первые четыре символа, если это XN-- то это считается пуникодом,
> и
> в таком виде отправляется на DNS сервак, а строку адреса преобразовывает к
> читаемому виду.
> Та же фигня, но обратно, - если в строке появляются локальные UTF
> коды,
> пишет префикс xn--, перекодирует остальную строку и засылает в DNS.
> https://www.opennet.ru/base/net/rus_dns.txt.html
> Грубо говоря, доменов с национальными буками не существует в природе :)
> Заплатив мильон баксов за домен секс.рф, в реальности купишь xn--e1aktc.xn--p1ai.

Так вот вопрос состоит в том, по какому алгоритму мне слово секс превратить в e1aktc

Ответить | Правка | Наверх | Cообщить модератору

3. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от PavelR (ok), 25-Дек-12, 08:07 
> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
> превратить в e1aktc

По алгоритму кодирования в Punycode.

Вас в гугле забанили или вы не смогли освоить сложную строку поиска?

Ответить | Правка | Наверх | Cообщить модератору

4. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 25-Дек-12, 08:14 
>> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
>> превратить в e1aktc
> По алгоритму кодирования в Punycode.
> Вас в гугле забанили или вы не смогли освоить сложную строку поиска?

Я не смог найти этот алгоритм, покажите мне его пожалуйста.

Ответить | Правка | Наверх | Cообщить модератору

5. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от PavelR (ok), 25-Дек-12, 11:45 
>>> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
>>> превратить в e1aktc
>> По алгоритму кодирования в Punycode.
>> Вас в гугле забанили или вы не смогли освоить сложную строку поиска?
> Я не смог найти этот алгоритм, покажите мне его пожалуйста.

http://www.rsdn.ru/forum/cpp/4045614.flat
http://en.wikipedia.org/wiki/Punycode

http://русский.idn.icann.org/Алгоритм_преобразования_интернационального_домена


Ответить | Правка | Наверх | Cообщить модератору

6. "Как работает Punycode? Алгоритм!!!"  –1 +/
Сообщение от platedzemail (ok), 25-Дек-12, 16:15 
>>>> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
>>>> превратить в e1aktc
>>> По алгоритму кодирования в Punycode.
>>> Вас в гугле забанили или вы не смогли освоить сложную строку поиска?
>> Я не смог найти этот алгоритм, покажите мне его пожалуйста.
> http://www.rsdn.ru/forum/cpp/4045614.flat
> http://en.wikipedia.org/wiki/Punycode
> http://русский.idn.icann.org/Алгоритм_преобразования_интернационального_домена

К сожалению я не знаю языка Глагол. Возможно http://en.wikipedia.org/wiki/Punycode достаточно прилично, но с английским у меня проблема. Если Можете объяснить по русски, то буду признателен

Ответить | Правка | Наверх | Cообщить модератору

7. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 25-Дек-12, 16:40 
>>> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
>>> превратить в e1aktc
>> По алгоритму кодирования в Punycode.
>> Вас в гугле забанили или вы не смогли освоить сложную строку поиска?
> Я не смог найти этот алгоритм, покажите мне его пожалуйста.

https://github.com/bestiejs/punycode.js/blob/master/punycode.js
http://ftp.gnu.org/gnu/libidn/ - там внутри примеров навалом.


/* Copyright (C) 2004-2012 Free Software Foundation, Inc.
   Author: Oliver Hitz

   This file is part of GNU Libidn.

   GNU Libidn is free software: you can redistribute it and/or
   modify it under the terms of either:

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version.

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at
       your option) any later version.

   or both in parallel, as here.

   GNU Libidn is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>. */

package gnu.inet.encoding;

/**
* This class offers static methods for encoding/decoding strings
* using the Punycode algorithm.
* <ul>
* <li>RFC3492 Punycode
* </ul>
* Note that this implementation only supports 16-bit Unicode code
* points.
*/
public class Punycode
{
  /* Punycode parameters */
  final static int TMIN = 1;
  final static int TMAX = 26;
  final static int BASE = 36;
  final static int INITIAL_N = 128;
  final static int INITIAL_BIAS = 72;
  final static int DAMP = 700;
  final static int SKEW = 38;
  final static char DELIMITER = '-';

  /**
   * Punycodes a unicode string.
   *
   * @param input Unicode string.
   * @return Punycoded string.
   */
  public static String encode(String input)
    throws PunycodeException
  {
    int n = INITIAL_N;
    int delta = 0;
    int bias = INITIAL_BIAS;
    StringBuffer output = new StringBuffer();

    // Copy all basic code points to the output
    int b = 0;
    for (int i = 0; i < input.length(); i++) {
      char c = input.charAt(i);
      if (isBasic(c)) {
    output.append(c);
    b++;
      }
    }

    // Append delimiter
    if (b > 0) {
      output.append(DELIMITER);
    }

    int h = b;
    while (h < input.length()) {
      int m = Integer.MAX_VALUE;

      // Find the minimum code point >= n
      for (int i = 0; i < input.length(); i++) {
    int c = input.charAt(i);
    if (c >= n && c < m) {
      m = c;
    }
      }

      if (m - n > (Integer.MAX_VALUE - delta) / (h + 1)) {
    throw new PunycodeException(PunycodeException.OVERFLOW);
      }
      delta = delta + (m - n) * (h + 1);
      n = m;

      for (int j = 0; j < input.length(); j++) {
    int c = input.charAt(j);
    if (c < n) {
      delta++;
      if (0 == delta) {
        throw new PunycodeException(PunycodeException.OVERFLOW);
      }
    }
    if (c == n) {
      int q = delta;

      for (int k = BASE;; k += BASE) {
        int t;
        if (k <= bias) {
          t = TMIN;
        } else if (k >= bias + TMAX) {
          t = TMAX;
        } else {
          t = k - bias;
        }
        if (q < t) {
          break;
        }
        output.append((char) digit2codepoint(t + (q - t) % (BASE - t)));
        q = (q - t) / (BASE - t);
      }

      output.append((char) digit2codepoint(q));
      bias = adapt(delta, h + 1, h == b);
      delta = 0;
      h++;
    }
      }

      delta++;
      n++;
    }

    return output.toString();
  }

  /**
   * Decode a punycoded string.
   *
   * @param input Punycode string
   * @return Unicode string.
   */
  public static String decode(String input)
    throws PunycodeException
  {
    int n = INITIAL_N;
    int i = 0;
    int bias = INITIAL_BIAS;
    StringBuffer output = new StringBuffer();

    int d = input.lastIndexOf(DELIMITER);
    if (d > 0) {
      for (int j = 0; j < d; j++) {
    char c = input.charAt(j);
    if (!isBasic(c)) {
      throw new PunycodeException(PunycodeException.BAD_INPUT);
    }
    output.append(c);
      }
      d++;
    } else {
      d = 0;
    }

    while (d < input.length()) {
      int oldi = i;
      int w = 1;

      for (int k = BASE; ; k += BASE) {
    if (d == input.length()) {
      throw new PunycodeException(PunycodeException.BAD_INPUT);
    }
    int c = input.charAt(d++);
    int digit = codepoint2digit(c);
    if (digit > (Integer.MAX_VALUE - i) / w) {
      throw new PunycodeException(PunycodeException.OVERFLOW);
    }

    i = i + digit * w;

    int t;
    if (k <= bias) {
      t = TMIN;
    } else if (k >= bias + TMAX) {
      t = TMAX;
    } else {
      t = k - bias;
    }
    if (digit < t) {
      break;
    }
    w = w * (BASE - t);
      }

      bias = adapt(i - oldi, output.length()+1, oldi == 0);

      if (i / (output.length() + 1) > Integer.MAX_VALUE - n) {
    throw new PunycodeException(PunycodeException.OVERFLOW);
      }

      n = n + i / (output.length() + 1);
      i = i % (output.length() + 1);
      output.insert(i, (char) n);
      i++;
    }

    return output.toString();
  }

  public final static int adapt(int delta, int numpoints, boolean first)
  {
    if (first) {
      delta = delta / DAMP;
    } else {
      delta = delta / 2;
    }

    delta = delta + (delta / numpoints);

    int k = 0;
    while (delta > ((BASE - TMIN) * TMAX) / 2) {
      delta = delta / (BASE - TMIN);
      k = k + BASE;
    }

    return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW);
  }

  public final static boolean isBasic(char c)
  {
    return c < 0x80;
  }

  public final static int digit2codepoint(int d)
    throws PunycodeException
  {
    if (d < 26) {
      // 0..25 : 'a'..'z'
      return d + 'a';
    } else if (d < 36) {
      // 26..35 : '0'..'9';
      return d - 26 + '0';
    } else {
      throw new PunycodeException(PunycodeException.BAD_INPUT);
    }
  }

  public final static int codepoint2digit(int c)
    throws PunycodeException
  {
    if (c - '0' < 10) {
      // '0'..'9' : 26..35
      return c - '0' + 26;
    } else if (c - 'a' < 26) {
      // 'a'..'z' : 0..25
      return c - 'a';
    } else {
      throw new PunycodeException(PunycodeException.BAD_INPUT);
    }
  }
}


Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

8. "Как работает Punycode? Алгоритм!!!"  +1 +/
Сообщение от platedzemail (ok), 25-Дек-12, 17:37 
Это все конечно, хорошо, но я был бы признателен если бы кто-нибудь русским языком описал, как это работает, примерно также, как это сделано в википедии, но понятным русским языком.
Ответить | Правка | Наверх | Cообщить модератору

9. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 26-Дек-12, 03:40 
> Это все конечно, хорошо, но я был бы признателен если бы кто-нибудь
> русским языком описал, как это работает, примерно также, как это сделано
> в википедии, но понятным русским языком.

Уже не знаешь, где спросить, поэтому попробуй здесь:

http://sysadmins.ru/post10842497.html
http://itbuben.org/blog/question/3006.html
http://forum.searchengines.ru/showthread.php?t=763747
http://hashcode.ru/questions/177353
http://forum.php.su/topic.php?forum=63&topic=23&v=l

Ответить | Правка | Наверх | Cообщить модератору

10. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 26-Дек-12, 07:31 
Разбирая класс http://phlymail.com/en/downloads/idna-convert.html в целом я застрял на конечном автомате, с которым познакомился только сегодня. Т.е. смысл кодировки сводится к тому, чтобы привести символы в их десятиричное представление. Убрать все не ascii символы, спереди добавить xn-- а в конце -. А дальше уже идет алгоритм конечного автомата, который кроется в функции   protected function _encode($decoded) и мне не очень понятен.
Ответить | Правка | Наверх | Cообщить модератору

11. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 26-Дек-12, 07:33 
Соответственно вопрос в том как работает конечный автомат, соответственно, для данного случае интересует больше. Но любой ответ будет в помощь
Ответить | Правка | Наверх | Cообщить модератору

12. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 28-Дек-12, 02:05 
Т.е. если я правильно понимаю, то алгоритм конечного автомата отличает наличие внутреннего состояния и внутренней памяти. Т.е. его отличие от обычного цикла или функции заключается в том, что выполнив какой-то алгоритм, скажем тот же цикл внутри функции он удерживает свое состояние.
Т.е. скажем есть некая функция, function а() в которой есть  var В  = 0;

[syntax=php]
$B = 0;
function a($var) {  
$C = 0;
for($i=0; $i<strlen($var); $i++) { $B++; C++; }

return C;
}

[/syntax]

Запуская скажем какой-то код вызовем эти функцию дважды, передав ей какое-то значение. Скажем посчитаем количество букв в слове корова. и запишем это количество букв в переменную С.
function a("корова");
После чего С = 6; B = 6;
Также дополним эту переменную в В количеством всех символов, т.к. предположим В считает количество всех символов.
А затем передадим слово БЫК,
function a("Бык");
Вызвав функцию повторно, и получим в переменной
С = 3, B = 9, т.к. B сохранила свое внутреннее состояние.
В принципе здесь есть внутренняя память но в ней нет смысла, т.ч. думаю, считать ее конечным автоматом вследствии этого нельзя. Или все таки можно?

Чтобы переменная B существовала осмысленно, а также следуя из
[url=http://dic.academic.ru/dic.nsf/ruwiki/1360454]диаграммы автомата мили[/url]
будем скажем прибавлять количество знаков к  С если  B>7, в ином случае будем вычитать;

Получим

[syntax=php]
$B = 0;
function a($var) {  
$C = 0;
for($i=0; $i<strlen($var); $i++) {  $B++;  if($B>7) {C++; }else  {C--; }}

return C;
}
[/syntax]

Во втором случае получим уже С с аргументом БЫК равное -1;
На практике не проверял, но думаю, что должно работать. Хотя к пинокоду это отношения не имеет, но для меня на данный момент важно понять насколько я усвоил понятие конечного автомата.
Все ли я правильно понял? Есть ли еще какие-то факторы отличающие конечный автомат?
Очень хотелось бы услышать ответ независимо от того, прав я или нет.

Ответить | Правка | Наверх | Cообщить модератору

13. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 01-Янв-13, 02:37 
В общем и целом более или менее разобрался, по крайней мере с кодированием, но осталось несколько вопросов.
Разбирал функцию _encode в php
http://xn----9sbcmrygis2b.xn--p1ai/rfc/3492.html
Весь алгоритм находится в функции _encode.
Неясными остались следующие параметры. Что они делают и зачем?
Так например понятно, что _tmax - это количество букв латинского алфавита
а _base - это количество букв латинского алфавита и цифры.
а initial_n - это количество ascii символов
А вот следующие параметры абсолютно непонятны.
skew = 38
damp = 700
initial_bias = 72
Поясните, пожалуйста, что они значат и для чего служат?
Также в функции _encode_digit неясны, что это за 22, 75 и 26
Ответить | Правка | Наверх | Cообщить модератору

14. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от noname.txt (?), 03-Янв-13, 11:25 
1) Там в комментах есть ссылки на RFC. В этих RFC есть алгоритм? Он мог бы быть именно там.
2) См. таблицы ASCII кодов. Вычитай номера одних символов из номеров других. Вероятно, получишь некоторые из сочетаний волшебных циферок. Вероятно, они именно это.
3) Похоже, там в комментах описаны смыслы некоторых величин.

P.S. Пример кода - пример плохо написанного кода: волшебные числа, имена переменных из одной буквы. Читать трудно, это мутный код. Попробуй поискать примеры, где нет комментариев, нет переменных из одной буквы, функции очень короткие. Такой код может быть хорошим, понятным. Но может и не быть, конечно.

Ответить | Правка | Наверх | Cообщить модератору

15. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 04-Янв-13, 01:48 
> 1) Там в комментах есть ссылки на RFC. В этих RFC есть
> алгоритм? Он мог бы быть именно там.
> 2) См. таблицы ASCII кодов. Вычитай номера одних символов из номеров других.
> Вероятно, получишь некоторые из сочетаний волшебных циферок. Вероятно, они именно это.
> 3) Похоже, там в комментах описаны смыслы некоторых величин.
> P.S. Пример кода - пример плохо написанного кода: волшебные числа, имена переменных
> из одной буквы. Читать трудно, это мутный код. Попробуй поискать примеры,
> где нет комментариев, нет переменных из одной буквы, функции очень короткие.
> Такой код может быть хорошим, понятным. Но может и не быть,
> конечно.

Да я код то впринципе разобрал. Просто некоторые цифры непонятные.
Просто есть например такие моменты, что делю я delta на 700 если  $is_first  = true.
Т.е. проще говоря, как только будет обнаружен первый интернациональный символ. А зачем и почему, не ясно и в первую очередь не ясно потому, что непонятно что это за 700 такая. Т.е. с переменными то уже не проблема. Я даже заменил некоторые переменные на конкретные значения, те. вместо $this->_base просто написал 36 и сразу понятно, что 36 это количество латинских букв и цифр.

Ответить | Правка | Наверх | Cообщить модератору

16. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 04-Янв-13, 08:51 
> А зачем и почему, не ясно

http://en.wikipedia.org/wiki/Numeral_system#Generalized_vari...

Ответить | Правка | К родителю #15 | Наверх | Cообщить модератору

17. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 04-Янв-13, 18:25 
>> А зачем и почему, не ясно
> http://en.wikipedia.org/wiki/Numeral_system#Generalized_vari...

Спасибо. Читаю про вес цифр, правда пользуясь переводчиком

1) 304 = 3×100 + 0×10 + 4×1 или более точно 3×102 + 0×101 + 4×100
Здесь насколько я понимаю, это вес 10,

а здесь
7 + 3*8 + 4*64 = 287
вес 8

Хотя следуя этому выражению
Цитата:
Например, в основе 8 целых чисел 437, цифры 7, 3, и 4, и веса 1, 8, и 64, таким образом, значение 7 + 3*8 + 4*64 = 287.


То получается, что вес это 8(или 10) в степени порядкового номера числа справа налево, начиная с нуля.

Как вообще это правильно будет? И как правильно понимать слово вес, в таких случаях в тех же документациях/инструкциях?

Ответить | Правка | К родителю #16 | Наверх | Cообщить модератору

18. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 04-Янв-13, 18:28 
А еще не ясно что значит mod в t + ((N - t) mod (base - t)),
и div в N (N - t) div (base - t)
Ответить | Правка | К родителю #17 | Наверх | Cообщить модератору

20. "Как работает Punycode? Алгоритм!!!"  +2 +/
Сообщение от pavlinux (ok), 04-Янв-13, 19:40 
> А еще не ясно что значит mod в t + ((N -
> t) mod (base - t)),
> и div в N (N - t) div (base - t)

mod - это модулярность, устанавливающая важное соотношение между эллиптическими кривыми над
полем рациональных чисел и модулярными формами, являющимися определёнными аналитическими
функциями комплексного переменного. Доказано для всех полустабильных эллиптических кривых
над полем рациональных чисел.

div - это дивергенция, дифференциальный оператор, отображающий векторное поле на скалярное,
то есть операция дифференцирования, в результате применения которой к векторному полю, получается
скалярное поле, который определяет, «насколько расходится входящее и исходящее из малой окрестности
данной точки поле, точнее — насколько расходятся входящий и исходящий поток.

Проще говоря, t + ((N - t) mod (base - t)) и N(N - t) div (base - t) -
есть соотношение модальной формы (base - t) при расхождения дифференциала
векторного поля (N - t) и всех полустабильных эллиптических кривых в скалярном поле [t; N]

Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

21. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 04-Янв-13, 21:18 
Большое спасибо за ответ. Напишите, пожалуйста, какое-нибудь простое уравнение отражающее это
Ответить | Правка | К родителю #20 | Наверх | Cообщить модератору

22. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 04-Янв-13, 21:20 
И по поводу веса как-то не очень понятно осталось.
Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

24. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 05-Янв-13, 01:10 
В школе у меня довольно плохо с математикой, да и школу я закончил уже очень и очень давно. Но если для понимания алгоритма мне нужно изучить какой-то материал, то я готов это сделать.
К сожалению, Ваш ответ звучит довольно удручающе и не вызывает у меня большого желания учиться и развиваться.
Ответить | Правка | Наверх | Cообщить модератору

25. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от shc0d3r (ok), 05-Янв-13, 01:46 
> В школе у меня довольно плохо с математикой, да и школу я
> закончил уже очень и очень давно. Но если для понимания алгоритма
> мне нужно изучить какой-то материал, то я готов это сделать.
> К сожалению, Ваш ответ звучит довольно удручающе и не вызывает у меня
> большого желания учиться и развиваться.

Плохо, что нет желания учиться. Вам были даны ссылки для понимания сути преобразования (поэтому я и предположил издёвку). Не могли бы Вы сейчас уточнить, что конкретно непонятно (согласитесь, что вопрос про div и mod был лишним.)?

Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

26. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 05-Янв-13, 02:36 
>> В школе у меня довольно плохо с математикой, да и школу я
>> закончил уже очень и очень давно. Но если для понимания алгоритма
>> мне нужно изучить какой-то материал, то я готов это сделать.
>> К сожалению, Ваш ответ звучит довольно удручающе и не вызывает у меня
>> большого желания учиться и развиваться.
> Плохо, что нет желания учиться. Вам были даны ссылки для понимания сути
> преобразования (поэтому я и предположил издёвку). Не могли бы Вы сейчас
> уточнить, что конкретно непонятно (согласитесь, что вопрос про div и mod
> был лишним.)?

Да нет, желания учиться достаточно, просто я хотел сказать, что ответ, навроде Вашего лишь убавляет энтузиазм.
По поводу mod и div я довольно плохо разбираюсь в терминалогии, на котором во-первых и основаны все темы, на которые здесь даны ссылки, и что не менее важно, я не знаю, английского. Да и на русском понимание таких тем не простая задача для меня.
Вот здесь
http://ru.wikipedia.org/wiki/%C4%E5%EB%E...
очень доходчиво объясняются mod и div, хотя мне для осмысления было достаточно взглянуть на этот пример.
Не считая непонятных для меня значений переменных, и чисел, неясным остался вопрос ВЕСА.

Ответить | Правка | К родителю #25 | Наверх | Cообщить модератору

27. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 05-Янв-13, 17:56 
> Напишите, пожалуйста, какое-нибудь простое уравнение отражающее это

x^n + y^n = z^n  

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

28. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от Andrey Mitrofanov (?), 05-Янв-13, 18:03 
>> Напишите, пожалуйста, какое-нибудь
> z^n

Нашёл своё /openforum/vsluhforumID4/427.html Счастье? После бета-тестинга обязательный платный вход будет, надеюсь?

Ответить | Правка | К родителю #27 | Наверх | Cообщить модератору

32. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 06-Янв-13, 06:54 
>>> Напишите, пожалуйста, какое-нибудь
>> z^n
> Нашёл своё /openforum/vsluhforumID4/427.html Счастье?
> После бета-тестинга обязательный платный вход будет, надеюсь?

:)

Ответить | Правка | К родителю #28 | Наверх | Cообщить модератору

29. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 05-Янв-13, 18:27 
>> Напишите, пожалуйста, какое-нибудь простое уравнение отражающее это
> x^n + y^n = z^n

Спасибо за ответ, в википедии довольно простой пример
78 mod 33 = 12
78 div 33 = 2
из которого все сразу ясно и понятно.
У меня вопрос в общем и целом с весом остался, если не сложно.
Только буду признателен, если пример будет максимально простой.

Ответить | Правка | К родителю #27 | Наверх | Cообщить модератору

30. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 05-Янв-13, 20:10 
И поясните, пожалуйста, что такое кодировка ascii2
http://commons.wikimedia.org/wiki/File:Ascii2.gif?uselang=ru
Т.е. ascii
http://commons.wikimedia.org/wiki/File:Ascii1.gif?uselang=ru
вроде понятно, она вроде как используется везде, т.е. во всех кодировках, до 128 символа
а вот с ascii2, как то я не понял.
Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

31. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 06-Янв-13, 01:48 
Если я правильно понял, эта картинка относится только к cp1251.
Если да, то буду признателен если еще про вес цифр объясните.
Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

34. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 06-Янв-13, 07:03 
> Если я правильно понял, эта картинка относится только к cp1251.
> Если да, то буду признателен если еще про вес цифр объясните.

http://ru.wikipedia.org/wiki/%D0%9F%D0%B...

Если нужна система счисления с равномерно распределёнными на числовой оси числами
с расстояниями между соседними числами не равными 1, то нужно ввести дополнительный
весовой коэффициент.

---

Начини вот с этой книжки - http://www.mccme.ru/mmmf-lectures/books/books/book.29.pdf

Тогда поймёшь, что Пуникод - это "36-ричная система с не кратными весами соседних разрядов без разделителей",
а все манипуляции и алгоритмы, это перевод из из 10-ной системы в 36-ную и обратно.

Ответить | Правка | К родителю #31 | Наверх | Cообщить модератору

33. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 06-Янв-13, 06:55 
> из которого все сразу ясно и понятно.

Ну если понятно, тогда чему тут равно?

(x^2+y^2) mod (x+1) = ?

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

35. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 06-Янв-13, 20:43 

> (x^2+y^2) mod (x+1) = ?

Спасибо за предоставленную литературу. Обязательно почитаю.
Хотя если сравнивать с той же шестрадцатиричной системой исчисления, то представление 36 ричной системы исчисления в виде пинокода мне не очень понятно, т.к. у нее отсутствует разделитель.
Т.е. если скажем в взять 16-ричное и десятичное представление, то их записать как 10 20 \xff\x4 к примеру, в случае с пинокодом такой разделитель отсутствует, по крайней мере явно. Хотя возможно в предоставленной Вами литературе, я получу ответ, на этот вопрос.


Понятия mod и div мне понятно, тк. делением по модулю я иногда пользуюсь, но в другой форме
72 % 33
а див также ясен, т.к. результатом будет  деление 78 / 33, но без остатка


> (x^2+y^2) mod (x+1) = ?

Запись навроде x^2 для меня не ясна, т.к. знак ^ известен мне как оператор XOR для сравнения двоичных файлов, с которыми я тоже познакомился довольно недавно, и лично мне сложно представить как данный оператор может использоваться для сравнения десятичных файлов, хотя подозреваю, что в Вашем уравнении этот знак носит несколько другой характер. В любом случае буду признателен за пояснение.

Ответить | Правка | К родителю #33 | Наверх | Cообщить модератору

36. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 07-Янв-13, 03:22 
> и лично мне сложно представить как данный оператор может использоваться для сравнения десятичных

5 XOR 33 = ЛОЖЬ :)

Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

37. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 07-Янв-13, 08:38 
>> и лично мне сложно представить как данный оператор может использоваться для сравнения десятичных
> 5 XOR 33 = ЛОЖЬ :)

JavaScript мне сказал что  5^33 = 36
Что в общем-то верно, учитывая что
00 01 01
^
10 00 01
=
10 01 00

Ответить | Правка | К родителю #36 | Наверх | Cообщить модератору

38. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 07-Янв-13, 08:40 
Почитал.

Неясным остались
уравшения с числами или переменными в нижнем регистре.
и уравнения типа L(125)=3L(5)=9
А также следующее
Десятичнуюза запись чисел можно преобразовать в запись, состоящую
из цифр 0, ±1, ±2, ±3, ±4, ±5, заменяя все цифры,
большие 5 на их дополнения до 10.
Например, перемножим числа 89 и 98. Запишем первое
из них как (1 -1 -1), а второе — (1 0 -2).
Подскажите, пожалуйста.

Забавы ради замечу, что здесь автор оказался неправ.

Кстати, кассиры в магазинах и на рынках предпочитают выдавать сдачу
начиная с мелких купюр, вопреки инструкции. Причина понятная — надеются,
что покупатель, получив мелочь, уйдёт, забыв взять крупные.

Продавщицы выдают начиная с мелких купюр т.к. так легче и быстрее считать, т.к. при счете они округляют
(досчитывая до нужной суммы) начиная с меньших
Т.е. если товар стоит 758 рублей, а покупатель заплатил 1000, то они доститывают до тысячи
9 60 70 80 90 800 900 1000
В ином случае им бы пришлось
858 958 968 978 988 998 999 1000

До конца еще дочитать не успел, хотя осталось немного, но в целом здесь описываются разные кодировки и представления чисел, что возможно
ближе к теме пинокода разные алгоритмы и последовательности их получения.
Но все-таки если брать сами кодировки то определенная последовательность  в кодировке в целом равна определенному
символу. И скажем в той же utf-8 всегда может быть отображена таблично http://unicode-table.com/ru/#0033
В пинокоде несколько иначе и код зависит от количества символом, как ascii так и не ascii, их номеру, кстати, в том же unicode
в десятичном представлении и порядке расположения. При этом почти аналогичные записи дадут совершенно разный результат,
так например xn--fdgr-83dm5g это fdgrавп
но стоит добавить единицу xn--1fdgr-83dm5g как это уже совсем другое слово 1EfГdПgr
из которых реальными остаются только 1fdgr, но уже в другой последовательности, а интернационалные и вовсе меняются. Т.е. пинокод это все-таки не кодировка, не двоичная не десятичная не шестнадцатиричная, а алгоримт преобразования, для преобразования которого уже используется десятичное представление шестнадцатиричной кодировки utf-8

Ответить | Правка | К родителю #37 | Наверх | Cообщить модератору

39. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от platedzemail (ok), 08-Янв-13, 19:16 
В целом в Punycode, относительно более или менее разобрался, хотя осталось несколько неясностей.
Из которых самое главное, чем обусловлено значение следующих переменных, т.е. почему именно 38 а не 37, 700 а не 800?
skew = 38
damp = 700
initial_bias = 72

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

static punycode_uint decode_digit(punycode_uint cp)
{
  return  cp - 48 < 10 ? cp - 22 :  cp - 65 < 26 ? cp - 65 :
          cp - 97 < 26 ? cp - 97 :  base;
}


static char encode_digit(punycode_uint d, int flag)
{
  return d + 22 + 75 * (d < 26) - ((flag != 0) << 5);
  /*  0..25 map to ASCII a..z or A..Z */
  /* 26..35 map to ASCII 0..9         */
}


Т.к. в самой спецификации я нигде этого не нашел, кроме как уже в реализации на c

Также неясны вопросы из прошлого сообщения и вопрос веса.
Также не будет лишним если кто-нибудь подскажет, как все это дело прикрутить к этому скрипту http://construktor.info/

Ответить | Правка | К родителю #38 | Наверх | Cообщить модератору

40. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от pavlinux (ok), 12-Янв-13, 18:19 
>>> и лично мне сложно представить как данный оператор может использоваться для сравнения десятичных
>> 5 XOR 33 = ЛОЖЬ :)
> JavaScript мне сказал что  5^33 = 36

XOR - это исключающие ИЛИ - результат будет ИСТИНА тогда, и только тогда,
когда ТОЛЬКО один и операндов является ИСТИНА!

5 - ИСТИНА, 33 - ИСТИНА ,  => ИСТИНА ^ ИСТИНА = ЛОЖЬ.

> Что в общем-то верно, учитывая что
> 00 01 01 ^ 10 00 01  = 10 01 00

А кто тебе сказал, что надо перевести в двоичную и по битам XORить?

Ответить | Правка | К родителю #37 | Наверх | Cообщить модератору

41. "Как работает Punycode? Алгоритм!!!"  +/
Сообщение от вован1 (?), 21-Ноя-16, 20:37 
>> Так вот вопрос состоит в том, по какому алгоритму мне слово секс
>> превратить в e1aktc
> По алгоритму кодирования в Punycode.
> Вас в гугле забанили или вы не смогли освоить сложную строку поиска?

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

а вообще янки видимо спецально мозги пудрят всем остальным с таким сложным алгоритмом - вот с таким :

Алгоритм преобразования punycode на русском
http://csc.sibsutis.ru/sites/csc.sibsutis.ru/files/courses/n...

цитата:
Число завершается тогда, когда его очередная цифра становится меньше, чем t(j). Bias – это способ определения количества цифр в числе. Алгоритм BOOTSRING (PUNYCODE) преобразования строк для IDNA (rfc3492, http...

Ответить | Правка | К родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру