Имя: Пароль:
1C
1С v8
Конвертировать строку в punycode
,
0 Dirk Diggler
 
13.07.17
17:29
Где глянуть готовое решение?
1 МихаилМ
 
13.07.17
17:38
2 Ёпрст
 
13.07.17
17:39
3 МихаилМ
 
13.07.17
17:45
4 Dirk Diggler
 
13.07.17
17:51
(1) для 1С
5 Ёпрст
 
13.07.17
18:00
(4) дык переводи
6 Ёпрст
 
13.07.17
18:00
врят ли кто делал ЭТО в 1с.
7 Dirk Diggler
 
13.07.17
19:21
(6) а как тогда решают вопрос отправки email из 1C? У меня релей, получив оттуда письмо по адресу на  домене .рф ругается и шлет всякую шляпу. А почтовые клиенты с ним же работают нормально, потому что конвертируют адреса при отправке писем.
8 NorthWind
 
13.07.17
21:35
(7) наверно, обходятся без доменов .рф...
9 stopa85
 
13.07.17
22:02
Процедура КодироватьНажатие(Элемент)
    ЭтаФорма.Punicode = КодироватьДомен( ЭтаФорма.КирилличтическийДомен );
КонецПроцедуры

Функция КодироватьДомен( Домен ) Экспорт
    
    Результат = "";
    
    МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( Домен, "." );
    
    Для каждого Элемент ИЗ МассивПодстрок Цикл
        
        ЕстьНеАНСИ = ложь;
        
        Для ц=1 ПО СтрДлина( Элемент ) Цикл
            
            Если КодСимвола( Элемент, ц ) >= 128 Тогда
                
                ЕстьНеАНСИ = Истина;
                Прервать;
                
            КонецЕсли;
                        
        КонецЦикла;
        
        Если ЕстьНеАНСИ Тогда
            
            Результат = Результат + ?(ПустаяСтрока(Результат),"",".") +
            "xn--" + Кодировать( НРег( Элемент ) );
            
        Иначе
            
            Результат = Результат + ?(ПустаяСтрока(Результат),"",".") + Элемент;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции


Функция Кодировать( Знач Кириллица )
    
    INITIAL_N = 128;
    INITIAL_BIAS = 72;
    DELIMITER = "-";
    Integer_MAX_VALUE = 2147483647;
    TMAX = 26;
    TMIN = 1;
    DAMP = 700;
    BASE = 36;
    
    n = INITIAL_N;
    delta = 0;
    bias = INITIAL_BIAS;
    output = "";

    // Copy all basic code points to the output
    b = 0;                                
    для i = 1 ПО СтрДлина(Кириллица) Цикл
        
        Если КодСимвола(Кириллица,i)<128 Тогда
            
            output = output + Сред(Кириллица,i,1);
            b=b+1;
            
        КонецЕсли;
        
    КонецЦикла;

    // Append delimiter
    Если (b > 0) Тогда
      output = output + DELIMITER;
    КонецЕсли;

    h = b;
    Пока (h < СтрДлина(Кириллица)) Цикл
        m = Integer_MAX_VALUE;

          // Find the minimum code point >= n
        Для i = 1 ПО СтрДлина(Кириллица) Цикл
               c = КодСимвола(Кириллица,i);
            Если (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;

          Для j = 1 ПО СтрДлина(Кириллица) Цикл
            c = КодСимвола(Кириллица,j);
            Если (c < n) ИЛИ (c < INITIAL_N) Тогда
                  delta = delta + 1;
                //if (0 == delta) {
                //    throw new PunycodeException(PunycodeException.OVERFLOW);
                //}
            КонецЕсли;
            Если (c = n) Тогда
                  q = delta;
                k = BASE;
                Пока Истина Цикл

                    Если (k <= bias) Тогда
                        t = TMIN;
                    ИначеЕсли (k >= bias + TMAX) Тогда
                        t = TMAX;
                    Иначе  
                        t = k - bias;
                    КонецЕсли;
                    
                    Если (q < t) Тогда
                          Прервать;
                    КонецЕсли;
                    
                    output = output + Строка(
                        Символ(
                            digit2codepoint(t + (q - t) % (BASE - t))
                            )
                        );
                        
                    q = Цел( (q - t) / (BASE - t) );
                    k = k + BASE;
                    
                КонецЦикла;

                  output = output + Строка(
                    Символ(
                        digit2codepoint(q)
                        )
                    );
                  bias = adapt(delta, h + 1, ?(h=b,ИСТИНА,ЛОЖЬ) );
                  delta = 0;
                  h = h + 1;
            КонецЕсли;
          КонецЦикла;

        delta = delta + 1;
        n = n + 1;
        
    КонецЦикла;

    Возврат output;
    
КонецФункции

Функция digit2codepoint(d)
    
    Если (d < 26) Тогда
        
        Возврат d + КодСимвола("a");
        
    ИначеЕсли (d < 36) Тогда
        // 26..35 : '0'..'9';
          Возврат d - 26 + КодСимвола("0");
        
    КонецЕсли;
    //{
    //  throw new PunycodeException(PunycodeException.BAD_INPUT);
    //}
    
КонецФункции

Функция adapt(знач delta, знач numpoints, first)
    
    DAMP = 700;
    BASE = 36;
    TMAX = 26;
    TMIN = 1;
    SKEW = 38;
    
    Если (first) Тогда
      delta = Цел( delta / DAMP );
    Иначе
      delta = Цел( delta / 2 );
    КонецЕсли;

    delta = delta + Цел(delta / numpoints);

    k = 0;
    Пока (delta > Цел( ((BASE - TMIN) * TMAX) / 2)) Цикл
      delta = Цел(delta / (BASE - TMIN));
      k = k + BASE;
    КонецЦикла;

    Возврат k + Цел(
        ((BASE - TMIN + 1) * delta) / (delta + SKEW)
        );
            
КонецФункции
10 stopa85
 
13.07.17
22:04
Убейте меня, но я не придумал ничего лучше копи-паста.

Когда-то делал конвертор в из кириллицы в пуникоде. Она даже паботает (вроде). Но делал без думно, транслируя код
11 Garykom
 
гуру
13.07.17
22:14
Изобретателей паникода ИМХО надо лечить...
12 Garykom
 
гуру
13.07.17
22:16
Ибо кодировка Base37 (или даже Base36 а "-" оставляем как служебный) решила бы все проблемы
13 NorthWind
 
15.07.17
18:02
(12) Вот что по этому поводу написано в английской вики:

Historical: UTF-5 and UTF-6

Proposals have been made for a UTF-5 and UTF-6 for the internationalization of domain names (IDN). The UTF-5 proposal used a base 32 encoding, where Punycode is (among other things, and not exactly) a base 36 encoding. The name UTF-5 for a code unit of 5 bits is explained by the equation 25 = 32.[3] The UTF-6 proposal added a running length encoding to UTF-5, here 6 simply stands for UTF-5 plus 1.[4] The IETF IDN WG later adopted the more efficient Punycode for this purpose.[5]

https://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings#UTF-5
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший