Re: RouterOS и кодировка SMS UCS-2
Добавлено: 26 июл 2019, 12:45
Поскольку в кодовых таблицах sms творится каша, работать предпочтительней, всё-таки, в PDU режиме.
Небольшая функция для преобразования текста из 7-bit.
Доделал скрипт от Andrey.Radomanov с первой страницы.
Соответственно массив alphabetToUtf8 можно заменить на UTF-16 или любую другую, хотя я и не представляю однобайтовую кодировку, в которую влезет каша из alphabet.
Небольшая функция для преобразования текста из 7-bit.
Доделал скрипт от Andrey.Radomanov с первой страницы.
Соответственно массив alphabetToUtf8 можно заменить на UTF-16 или любую другую, хотя я и не представляю однобайтовую кодировку, в которую влезет каша из alphabet.
Код: Выделить всё
###########функция конвертации 7bit в UTF-8 текст##########################
# Работает основываясь на GSM 03.38
# SMS передаётся в кодовой таблице alphabet, таблица совместима по битно, только английскими символами ANSII
# Обратите внимание, alphabet имеет escape(0x1B) последовательность для десяти символов.
# В функцию надо передать аргумент с именем "instring”
:local convert7bitToUtf8 do={
:local alphabetToUtf8 {0="\40";1="\C2\A3";2="\24";3="\C2\A5";4="\C3\A8";5="\C3\A9";6="\C3\B9";7="\C3\AC";8="\C3\B2";9="\C3\87";10="\0A";11="\C3\98";12="\C3\B8";13="\0D";14="\C3\85";15="\C3\A5";16="\CE\94";17="\5F";18="\CE\A6";19="\CE\93";20="\CE\9B";21="\CE\A9";22="\CE\A0";23="\CE\A8";24="\CE\A3";25="\CE\98";26="\CE\9E";28="\C3\86";29="\C3\A6";30="\C3\9F";31="\C3\89";32="\20";33="\21";34="\22";35="\23";36="\C2\A4";37="\25";38="\26";39="\27";40="\28";41="\29";42="\2A";43="\2B";44="\2C";45="\2D";46="\2E";47="\2F";48="\30";49="\31";50="\32";51="\33";52="\34";53="\35";54="\36";55="\37";56="\38";57="\39";58="\3A";59="\3B";60="\3C";61="\3D";62="\3E";63="\3F";64="\C2\A1";65="\41";66="\42";67="\43";68="\44";69="\45";70="\46";71="\47";72="\48";73="\49";74="\4A";75="\4B";76="\4C";77="\4D";78="\4E";79="\4F";80="\50";81="\51";82="\52";83="\53";84="\54";85="\55";86="\56";87="\57";88="\58";89="\59";90="\5A";91="\C3\84";92="\C3\96";93="\C3\91";94="\C3\9C";95="\C2\A7";96="\C2\BF";97="\61";98="\62";99="\63";100="\64";101="\65";102="\66";103="\67";104="\68";105="\69";106="\6A";107="\6B";108="\6C";109="\6D";110="\6E";111="\6F";112="\70";113="\71";114="\72";115="\73";116="\74";117="\75";118="\76";119="\77";120="\78";121="\79";122="\7A";123="\C3\A4";124="\C3\B6";125="\C3\B1";126="\C3\BC";127="\C3\A0";3466="\0C";3476="\5E";3496="\7B";3497="\7D";3503="\5C";3516="\5B";3517="\7E";3518="\5D";3520="\7C";3557="\E2\82\AC";};
:local curbit 0;
:local nextpart 0;
:local escape false;
:local decodedLine "";
:for curposition from=0 to=([:len $instring] - 1) step=2 do={
:local charcode [:tonum ("0x".[:pick $instring $curposition ($curposition +2)])];
:local tmp ($charcode & (127>>$curbit));
:set $tmp ($tmp<<$curbit);
:set $tmp ($tmp + $nextpart);
:set $nextpart ($charcode>>(7-$curbit));
:set curbit ($curbit+1);
:if ($tmp = 27) do={:set $escape true;} else={
:if ($escape) do={:set $decodedLine ($decodedLine.($alphabetToUtf8->[:tostr (3456 | $tmp)]));
:set $escape false;
} else={:set $decodedLine ($decodedLine.($alphabetToUtf8->[:tostr $tmp]));};};
:if ($curbit = 7) do={
:set $tmp $nextpart;
:if ($tmp = 27) do={:set $escape true;} else={
:if ($escape) do={:set $decodedLine ($decodedLine.($alphabetToUtf8->[:tostr (3456 | $tmp)]));
:set $escape false;
} else={:set $decodedLine ($decodedLine.($alphabetToUtf8->[:tostr $tmp]));};};
:set $curbit 0;
:set $nextpart 0;
};
};
:return $decodedLine;
};
########## Конец функции ###################################################
# Пример:
# Получаем строку из SMS, USSD, номер телефона и так далее
# Для примера использована строка "Hello world!"
:local smsText "C8329BFD06DDDF72363904";
# Указываем переменную куда будет помещена декомпилированная строка
# и вызываем функцию
:local parsedTEXT [$convert7bitToUtf8 instring=$smsText];
:log info $parsedTEXT;