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