LINUX.ORG.RU

Gawk. Декодирование строк

 ,


0

1

Господа, всем шалом. Кто подскажет? Есть файл с кодированными строками вида:

%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D0%91%D0%A2%D0%98%D0%98%D0%A3%D0%9A_1201_%D0%BF%D0%B8%D0%BA
Вывожу их на экран в человекочитаемом формате. На bash всё умещается в несколько строк, не вопрос. Решил на gawk попробовать и вот что получается:
gawk 'BEGIN { printf %s\n, \xD0\xA0\xD1\x83\xD1\x87 }'
=> Руч
т.е. всё ОК. Но если читать строку в переменную, то не ОК
gawk 'BEGIN { str="%D0%A0%D1%83%D1%87"; gsub("%","\\x",str); printf "%s\n", str }'
=> \xD0\xA0\xD1\x83\xD1\x87 
Как-то можно это починить?

т.е. всё ОК. Но если читать строку в переменную, то не ОК

Так в переменную же читаешь совсем другое. \xD0\xA0\xD1\x83\xD1\x87 даёт байты с указанными значениями. А gsub(«%»,«\x»,str) даёт строку с четырьмя байтами на каждый нужный.

Смотри сюда: https://stackoverflow.com/questions/3728049/using-awk-printf-to-urldecode-text

monk ★★★★★
()

awk тебе никакого раскодирования не делает - в первом примере у тебя это делает шелл и вызывается awk 'BEGIN { printf "%s\n", "Руч" }'. Читай ман на свой авк, тебе нужно явно пройтись по строке, найти в ней ‘%[0-9A-F][0-9A-f]’, взять оттуда 2 последние байта, раскодировать их из 16-ричной системы и вывести получившийся байт.

slovazap ★★★★★
()
$ gawk -b 'BEGIN { s="%D0%A0%D1%83%D1%87"; split(s,a,"%"); for (i in a) { if (a[i]) printf("%c", strtonum("0x" a[i])); } print }'
Руч

Ключик -b (--characters-as-bytes) означает, что все символы интерпретируются как отдельные байты.

ASavonte
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.