РоутерОС известной компании Микротик не позволяет штатными средствами отправлять сообщения на русском языке в Телеграмм. Русские символы могут быть адекватно отображены в сообщениях, если отправлены в кодировке UTF-8. Ну что же коды известны, почему бы не написать перекодировщик?
Для упрощения задачи я не пользовался алгоритмами преобразования, а создал ключевой массив, содержащий в виде ключей сами русские символы в строковой и прописной раскладках, а в соответствующих им значениях коды этих символов в UTF-8.
Вот этот массив данных, может и для других задач пригодится:
:local rsimv [:toarray {А=D090; Б=D091; В=D092; Г=D093; Д=D094; Е=D095; Ж=D096; З=D097; И=D098; Й=D099; К=D09A; Л=D09B; М=D09C; Н=D09D; О=D09E; П=D09F; Р=D0A0; С=D0A1; Т=D0A2; У=D0A3; Ф=D0A4; Х=D0A5; Ц=D0A6; А=D0A7; Ш=D0A8; Щ=D0A9; а=D0AA; =D0AB; Ь=D0AC; Э=D0AD; Ю=D0AE; Я=D0AF; а=D0B0; б=D0B1; в=D0B2; г=D0B3; д=D0B4; е=D0B5; ж=D0B6; з=D0B7; и=D0B8; й=D0B9; к=D0BA; л=D0BB; м=D0BC; н=D0BD; о=D0BE; п=D0BF; р=D180; с=D181; т=D182; у=D183; ф=D184; х=D185; ц=D186; ч=D187; ш=D188; щ=D189; ъ=D18A; ы=D18B; ь=D18C; э=D18D; ю=D18E; я=D18F; Ё=D001; ё=D191}]
Пишем непосредственно сам конвертер строки.
На входе в переменной $string должна быть строка, содержащая русский или смешанный русско-английский текст. На выходе собранная строка, готовая для отправки в Телеграмм. При этом символы латинского афавита и знаки препинания не перекодируются, так как нормально отображаются в чатах мессенджера. Вместо русских символов в строку вставляются их аналоги в UTF-8 кодах, разделенные знаками "%", используемые Телеграмм для отображения символов в кодах.
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
Оформим всё это в функцию FuncStrToTele, чтобы можно было вызывать её из любых своих скриптов в РоутерОс Микротик. Также можно её использовать в DUDe. Вот ёё полный код:
# by Sertik 09/09/2020
# usage [$FuncStrToTele Строка String .,!+]
:global FuncStrToTele do={
:global string; :set $string $1;
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {А=D090; Б=D091; В=D092; Г=D093; Д=D094; Е=D095; Ж=D096; З=D097; И=D098; Й=D099; К=D09A; Л=D09B; М=D09C; Н=D09D; О=D09E; П=D09F; Р=D0A0; С=D0A1; Т=D0A2; У=D0A3; Ф=D0A4; Х=D0A5; Ц=D0A6; А=D0A7; Ш=D0A8; Щ=D0A9; а=D0AA; =D0AB; Ь=D0AC; Э=D0AD; Ю=D0AE; Я=D0AF; а=D0B0; б=D0B1; в=D0B2; г=D0B3; д=D0B4; е=D0B5; ж=D0B6; з=D0B7; и=D0B8; й=D0B9; к=D0BA; л=D0BB; м=D0BC; н=D0BD; о=D0BE; п=D0BF; р=D180; с=D181; т=D182; у=D183; ф=D184; х=D185; ц=D186; ч=D187; ш=D188; щ=D189; ъ=D18A; ы=D18B; ь=D18C; э=D18D; ю=D18E; я=D18F; Ё=D001; ё=D191}]
# encoding of the symbols and аssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
:set $string $StrTele
:return $string;
}
Как видно из комментария единственным параметром функции является входная строка символов, возвращает функция сформированную строку для отправки в переменной $string
В своих скриптах не забываем объявлять ранее определенную функцию для вызова:
:global FuncStrToTele
[$FuncStrToTele Привет, user !]
Чтобы отправить сообщение нужно создать своего бота в Телеграмм, узнать его API BOTToken и ID чата. Инструкции по созданию ботов и получению идентификаторов неоднократно публиковались.
Отправляем наше тестовое сообщение в чат бота:
:local botID botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX;
:local myChatID YYYYYY;
:global FuncStrToTele;
:local string [$FuncStrToTele Привет от Sertik! Работает функция-конвертер Russian alfabit для Telegramm]
:tool fetch url=(api.telegram.org$botID/sendmes xt=$string) keep-result=no
Проверяйте, у меня отлично работает. Теперь можно без всякого труда отправлять в Телегу сообщения на русском языке! Замечания и дополнения приветствуются.
Вероятно целесообразно добавить отправку кода символа переноса строки, это не сложно сделать.