Приветствую.
У меня есть вопрос
Есть глобальная переменная JSONIn, я не нашел какая функция формирует данную переменную.
Мне это нужно для выяснения - почему неправильно формируется пробел.
Мне захотелось интегрировать кириллицу но Mikrotik script к сожалению её не понимает, пришлось придумывать обходной маневр. Я проанализировал переменную JSONIn и увидел что текст кодируется кодировкой Unicode, и я написал обработку которая Unicode кодирует в URL код. Тем самым это позволило полноценно использовать кириллицу.
Так как я увлекся reply кнопками захотелось полноценной поддержки кириллицы.
Очень хочу выяснить почему пробел не формируется в код?
Телеграмма для Mikrotik...
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Переменная JSONIn относится к переменным JSON-парсера Александра Чупакабры. Brook использует этот парсер в своей "Телеграмме для Микротик".
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Вот функция перекодировки CP1251 от Rextended (https://forum.mikrotik.com/viewtopic.php?t=177551) :
Код: Выделить всё
:global ASCIItoCP1251toURLencode do={
:local ascii "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\
\10\11\12\13\14\15\16\17\18\19\1A\1B\1C\1D\1E\1F\
\20\21\22\23\24\25\26\27\28\29\2A\2B\2C\2D\2E\2F\
\30\31\32\33\34\35\36\37\38\39\3A\3B\3C\3D\3E\3F\
\40\41\42\43\44\45\46\47\48\49\4A\4B\4C\4D\4E\4F\
\50\51\52\53\54\55\56\57\58\59\5A\5B\5C\5D\5E\5F\
\60\61\62\63\64\65\66\67\68\69\6A\6B\6C\6D\6E\6F\
\70\71\72\73\74\75\76\77\78\79\7A\7B\7C\7D\7E\7F\
\80\81\82\83\84\85\86\87\88\89\8A\8B\8C\8D\8E\8F\
\90\91\92\93\94\95\96\97\98\99\9A\9B\9C\9D\9E\9F\
\A0\A1\A2\A3\A4\A5\A6\A7\A8\A9\AA\AB\AC\AD\AE\AF\
\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\
\C0\C1\C2\C3\C4\C5\C6\C7\C8\C9\CA\CB\CC\CD\CE\CF\
\D0\D1\D2\D3\D4\D5\D6\D7\D8\D9\DA\DB\DC\DD\DE\DF\
\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\
\F0\F1\F2\F3\F4\F5\F6\F7\F8\F9\FA\FB\FC\FD\FE\FF"
:local CP1251toURLe {"00";"01";"02";"03";"04";"05";"06";"07";"08";"09";"0A";"0B";"0C";"0D";"0E";"0F";
"10";"11";"12";"13";"14";"15";"16";"17";"18";"19";"1A";"1B";"1C";"1D";"1E";"1F";
"+";"21";"22";"23";"24";"25";"26";"27";"28";"29";"2A";"2B";"2C";"-";".";"2F";
"0";"1";"2";"3";"4";"5";"6";"7";"8";"9";"3A";"3B";"3C";"3D";"3E";"3F";
"40";"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";
"P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z";"5B";"5C";"5D";"5E";"_";
"60";"a";"b";"c";"d";"e";"f";"g";"h";"i";"j";"k";"l";"m";"n";"o";
"p";"q";"r";"s";"t";"u";"v";"w";"x";"y";"z";"7B";"7C";"7D";"~";"7F";
"D082";"D083";"E2809A";"D193";"E2809E";"E280A6";"E280A0";"E280A1";"E282AC";"E280B0";"D089";"E280B9";"D08A";"D08C";"D08B";"D08F";
"D192";"E28098";"E28099";"E2809C";"E2809D";"E280A2";"E28093";"E28094";"EFBFBD";"E284A2";"D199";"E280BA";"D19A";"D19C";"D19B";"D19F";
"C2A0";"D08E";"D19E";"D088";"C2A4";"D290";"C2A6";"C2A7";"D081";"C2A9";"D084";"C2AB";"C2AC";"C2AD";"C2AE";"D087";
"C2B0";"C2B1";"D086";"D196";"D291";"C2B5";"C2B6";"C2B7";"D191";"E28496";"D194";"C2BB";"D198";"D085";"D195";"D197";
"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"
}
:local string $1
:if (([:typeof $string] != "str") or ($string = "")) do={ :return "" }
:local lenstr [:len $string]
:local constr ""
:for pos from=0 to=($lenstr - 1) do={
:local urle ($CP1251toURLe->[:find $ascii [:pick $string $pos ($pos + 1)] -1])
:local sym $urle
:if ([:len $urle] = 2) do={:set sym "%$[:pick $urle 0 2]" }
:if ([:len $urle] = 4) do={:set sym "%$[:pick $urle 0 2]%$[:pick $urle 2 4]" }
:if ([:len $urle] = 6) do={:set sym "%$[:pick $urle 0 2]%$[:pick $urle 2 4]%$[:pick $urle 4 6]" }
:set constr "$constr$sym"
}
:return $constr
}
example code
:put [$ASCIItoCP1251toURLencode ("test on Cyrillic is \F2\E5\F1\F2 (on CP1251)")]
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Помню, при работе над геоБотом, была проблема с пробелом на таких кнопках. Решил не копать глубоко и использовал вместо него "\20". В репли кнопках такой ход нормально работает.Apollo22 писал(а): ↑13 окт 2023, 12:52 Приветствую.
У меня есть вопрос
Есть глобальная переменная JSONIn, я не нашел какая функция формирует данную переменную.
Мне это нужно для выяснения - почему неправильно формируется пробел.
Мне захотелось интегрировать кириллицу но Mikrotik script к сожалению её не понимает, пришлось придумывать обходной маневр. Я проанализировал переменную JSONIn и увидел что текст кодируется кодировкой Unicode, и я написал обработку которая Unicode кодирует в URL код. Тем самым это позволило полноценно использовать кириллицу.
Так как я увлекся reply кнопками захотелось полноценной поддержки кириллицы.
Очень хочу выяснить почему пробел не формируется в код?
В том проекте реализовано мгновенное переключение языка интерфейса с английского на русский и наоборот. Все слова хранятся в массиве со своими ключами и значениями. Если нужно какое-то слово, то дергаем его из массива по ключу.
В русском варианте все буквы кодированы в 16-ричном формате, в том числе и пробел. Было замечено, если пробел в начале или конце строки, то проблем нет. Если он в середине, то получаем проблему. Не стал заморачиваться и использовал его 16-ричное значение.
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Уважаемый Sertik прав, я использую парсер Чупакабры. ИМХО ничего лучше еще не придумали для JSON. Там для преобразования в UTF8 используется побитовый сдвиг вправо. В итоге пробел там тоже такой - "\20"
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Кстати просил тут недавно затестить нового бота. Он на мощной железке крутится CCR-1036.
По идее должен потянуть большой поток, но руки так и не дошли написать статью о нем на Хабре, чтобы привлечь людей.
Может все-таки сообщество подключится...

https://t.me/xgeoBot
По идее должен потянуть большой поток, но руки так и не дошли написать статью о нем на Хабре, чтобы привлечь людей.
Может все-таки сообщество подключится...

https://t.me/xgeoBot
-
- Сообщения: 25
- Зарегистрирован: 05 ноя 2022, 21:27
Sertik писал(а): ↑13 окт 2023, 15:31 Вот функция перекодировки CP1251 от Rextended (https://forum.mikrotik.com/viewtopic.php?t=177551) :
Код: Выделить всё
:global ASCIItoCP1251toURLencode do={ :local ascii "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\ \10\11\12\13\14\15\16\17\18\19\1A\1B\1C\1D\1E\1F\ \20\21\22\23\24\25\26\27\28\29\2A\2B\2C\2D\2E\2F\ \30\31\32\33\34\35\36\37\38\39\3A\3B\3C\3D\3E\3F\ \40\41\42\43\44\45\46\47\48\49\4A\4B\4C\4D\4E\4F\ \50\51\52\53\54\55\56\57\58\59\5A\5B\5C\5D\5E\5F\ \60\61\62\63\64\65\66\67\68\69\6A\6B\6C\6D\6E\6F\ \70\71\72\73\74\75\76\77\78\79\7A\7B\7C\7D\7E\7F\ \80\81\82\83\84\85\86\87\88\89\8A\8B\8C\8D\8E\8F\ \90\91\92\93\94\95\96\97\98\99\9A\9B\9C\9D\9E\9F\ \A0\A1\A2\A3\A4\A5\A6\A7\A8\A9\AA\AB\AC\AD\AE\AF\ \B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\ \C0\C1\C2\C3\C4\C5\C6\C7\C8\C9\CA\CB\CC\CD\CE\CF\ \D0\D1\D2\D3\D4\D5\D6\D7\D8\D9\DA\DB\DC\DD\DE\DF\ \E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\ \F0\F1\F2\F3\F4\F5\F6\F7\F8\F9\FA\FB\FC\FD\FE\FF" :local CP1251toURLe {"00";"01";"02";"03";"04";"05";"06";"07";"08";"09";"0A";"0B";"0C";"0D";"0E";"0F"; "10";"11";"12";"13";"14";"15";"16";"17";"18";"19";"1A";"1B";"1C";"1D";"1E";"1F"; "+";"21";"22";"23";"24";"25";"26";"27";"28";"29";"2A";"2B";"2C";"-";".";"2F"; "0";"1";"2";"3";"4";"5";"6";"7";"8";"9";"3A";"3B";"3C";"3D";"3E";"3F"; "40";"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O"; "P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z";"5B";"5C";"5D";"5E";"_"; "60";"a";"b";"c";"d";"e";"f";"g";"h";"i";"j";"k";"l";"m";"n";"o"; "p";"q";"r";"s";"t";"u";"v";"w";"x";"y";"z";"7B";"7C";"7D";"~";"7F"; "D082";"D083";"E2809A";"D193";"E2809E";"E280A6";"E280A0";"E280A1";"E282AC";"E280B0";"D089";"E280B9";"D08A";"D08C";"D08B";"D08F"; "D192";"E28098";"E28099";"E2809C";"E2809D";"E280A2";"E28093";"E28094";"EFBFBD";"E284A2";"D199";"E280BA";"D19A";"D19C";"D19B";"D19F"; "C2A0";"D08E";"D19E";"D088";"C2A4";"D290";"C2A6";"C2A7";"D081";"C2A9";"D084";"C2AB";"C2AC";"C2AD";"C2AE";"D087"; "C2B0";"C2B1";"D086";"D196";"D291";"C2B5";"C2B6";"C2B7";"D191";"E28496";"D194";"C2BB";"D198";"D085";"D195";"D197"; "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" } :local string $1 :if (([:typeof $string] != "str") or ($string = "")) do={ :return "" } :local lenstr [:len $string] :local constr "" :for pos from=0 to=($lenstr - 1) do={ :local urle ($CP1251toURLe->[:find $ascii [:pick $string $pos ($pos + 1)] -1]) :local sym $urle :if ([:len $urle] = 2) do={:set sym "%$[:pick $urle 0 2]" } :if ([:len $urle] = 4) do={:set sym "%$[:pick $urle 0 2]%$[:pick $urle 2 4]" } :if ([:len $urle] = 6) do={:set sym "%$[:pick $urle 0 2]%$[:pick $urle 2 4]%$[:pick $urle 4 6]" } :set constr "$constr$sym" } :return $constr } example code :put [$ASCIItoCP1251toURLencode ("test on Cyrillic is \F2\E5\F1\F2 (on CP1251)")]
Спасибо, это немного не то. И если честно я даже не пытался что-то найти похожее.
Поэтому написал свое

Вот мой код
Код: Выделить всё
:global fUnicodeToURL
:if (!any $fUnicodeToURL) do={ :global fUnicodeToURL do={
:local Ubytes [:tonum $1]
:local EscapeStr ""
:local HighByte
:local LowByte
:local firstList {1088;1089;1090;1091;1092;1093;1094;1095;1096;1097;1098;1099;1100;1101;1102;1103}
:if ([:typeof [:find $firstList "$Ubytes"]] != "nil") do={
#Для маленьких букв
:set HighByte (0xD1 | (($Ubytes - 0x0430 + 0xC0) >> 8))
:set LowByte (0x80 | ($Ubytes & 0x3F))
:put ("LowByte")
} else={
#Для больших букв
:set HighByte (0xD0 | (($Ubytes - 0x0410 + 0xC0) >> 8))
:set LowByte (0x80 | ($Ubytes & 0xFF))
:put ("HighByte")
}
:set EscapeStr ( "%".[:tostr [:pick "0123456789ABCDEF" ( $HighByte >> 4 & 0xF)]].[:tostr [:pick "0123456789ABCDEF" ( $HighByte & 0xF)]])
:set EscapeStr ($EscapeStr . "%".[:tostr [:pick "0123456789ABCDEF" ( $LowByte >> 4 & 0xF)]].[:tostr [:pick "0123456789ABCDEF" ( $LowByte & 0xF)]])
:return $EscapeStr
}}
-
- Сообщения: 25
- Зарегистрирован: 05 ноя 2022, 21:27
Привет Brook, спасибо за конкурс.
Telegram Bot который вы создали это нечто.
Но в итоге оказалось что дорабатывают его очень мало людей.
У меня есть предложение давайте создадим облачный сервис для управления Mikrotik.
Это более перспективное направление. Плюс можно будет управлять несколькими роутерами одновременно.
Сам я это не осилю так как почти не знаю языков программирования.
Telegram Bot который вы создали это нечто.
Но в итоге оказалось что дорабатывают его очень мало людей.
У меня есть предложение давайте создадим облачный сервис для управления Mikrotik.
Это более перспективное направление. Плюс можно будет управлять несколькими роутерами одновременно.
Сам я это не осилю так как почти не знаю языков программирования.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Заманчивое предложение ... Brook будет писать 

фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947