Значения Unicode в вашей строке имеют определенный шаблон c:
u:___;___;___;
, где каждое ___
является шестнадцатеричным значением, представляющим кодовую точку.
Вы можете сопоставить этот шаблон используя регулярное выражение, и замените закодированные значения соответствующими символами Unicode с помощью gsub
:
str = '25.02.2020 13:57:56:\nu:633;644;627;645; u:627;633;62a;627;62f; u:645;6cc;634;647; u:644;637;641; u:6a9;646;6cc;62f; u:622;645;648;632;634; u:6a9;627;631; u:628;627; u:627;6cc;646; u:628;631;646;627;645;647; u:627;632; u:635;641;631; u:62a;627; u:635;62f; u:631;648; u:628;641;631;645;627;6cc;6cc;62f; u:645;645;646;648;646; u:627;632; u:634;645;627;\n\n\nСервис'
str.gsub(/u:((?:\h+;)+)/) { Regexp.last_match(1).split(';').map(&:hex).pack('U*') }
#=> "25.02.2020 13:57:56:\\nسلام استاد میشه لطف کنید آموزش کار با این برنامه از صفر تا صد رو بفرمایید ممنون از شما\\n\\n\\nСервис"
Шаг за шагом: (для каждого совпадения)
- совпадение регулярного выражения
"u:633;644;627;645;"
Regexp.last_match(1)
возвращает первую группу захвата "633;644;627;645;"
split(';')
превращает это в ["633", "644", "627", "645"]
map(&:hex)
преобразует элементы в [1587, 1604, 1575, 1605]
pack('U*')
интерпретирует их как кодовые точки Unicode и возвращает "سلام"