|   |   | 
| 
 | Конвертировать строку в 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 | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |