Я ищу эквивалент urlencode для вывода на терминал - мне нужно убедиться, что символы мусора, которые я (могу) распечатать из внешнего источника, в конечном итоге не повлияют на мой терминал, поэтому предварительно упакованная функция для выхода Последовательности специальных символов были бы идеальными.
Я работаю на Python, но все, что я могу легко перевести, тоже работает. TIA!






Вы можете пропустить это через струны
./command | strings
Это приведет к удалению нестроковых символов
К сожалению, «конечный вывод» - очень плохо определенный критерий для фильтрации (см. вопрос 418176). Я бы предложил просто внести в белый список символы, которые вы хотите разрешить (это будет большая часть string.printable), и заменить все остальные любым экранированным форматом, который вам нравится (\ FF,% FF и т. д.), Или даже просто удалить их.
$ ./command | cat -v $ cat --help | grep nonprinting -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Вот то же самое в py3k на основе android / cat.c:
#!/usr/bin/env python3
"""Emulate `cat -v` behaviour.
use ^ and M- notation, except for LFD and TAB
NOTE: python exits on ^Z in stdin on Windows
NOTE: newlines handling skewed towards interactive terminal.
Particularly, applying the conversion twice might *not* be a no-op
"""
import fileinput, sys
def escape(bytes):
for b in bytes:
assert 0 <= b < 0x100
if b in (0x09, 0x0a): # '\t\n'
yield b
continue
if b > 0x7f: # not ascii
yield 0x4d # 'M'
yield 0x2d # '-'
b &= 0x7f
if b < 0x20: # control char
yield 0x5e # '^'
b |= 0x40
elif b == 0x7f:
yield 0x5e # '^'
yield 0x3f # '?'
continue
yield b
if __name__ == '__main__':
write_bytes = sys.stdout.buffer.write
for bytes in fileinput.input(mode = "rb"):
write_bytes(escape(bytes))
Пример:
$ perl -e"print map chr,0..0xff" > bytes.bin $ cat -v bytes.bin > cat-v.out $ python30 cat-v.py bytes.bin > python.out $ diff -s cat-v.out python.out
Он печатает:
Files cat-v.out and python.out are identical
Очень хорошо, спасибо за перенос / указание на реализацию.
Если вы ведете журнал или распечатываете отладочную информацию, я обычно использую repr(), чтобы получить безобидную версию объекта для печати, включая строки. Это может быть, а может и не быть тем, что вы хотели; метод cat --show-nonprinting, который другие использовали в других ответах, лучше подходит для многострочного вывода.
x = get_weird_data()
print repr(x)
Я все еще хотел бы отобразить символы, но так, чтобы не было побочных эффектов в самом терминале. Тем не менее, это хороший запасной план!