2013-04-04 4 views
2

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

Каким будет лучший способ фильтрации ошибочных пакетов перед их отображением при сохранении большинства специальных символов? Что такое последовательности, которые могут изменить поведение терминала?

Я также хотел бы добавить, что помимо скремблированного вывода приложение по-прежнему работает так, как должно.

+0

Вывести выход на 'cat -v'. – choroba

ответ

2

Ваш терминал может отвечать на ANSI escape codes. Для предотвращения данных от непреднамеренного влияния на терминал, можно распечатать repr данных, а не сами данные:

Например,

good = 'hello' 
bad = '\033[41mRED' 

print('{!r}'.format(good)) 
print('{!r}'.format(bad)) 

дает

'hello' 
'\x1b[41mRED' 

тогда

print(good) 
print(bad) 

дает

enter image description here

(Btw, набрав reset сбросит терминал.)

+0

Это похоже на то, что я ищу, спасибо! – petr

0

Когда вы получаете пакет проверить его на валидность перед выводом его. Одна из возможностей - проверить, чтобы каждый символ в пакете печатался, то есть в диапазоне 32-127 десятичных знаков, перед выходом. Или добавьте контрольные суммы в пакеты и отклоните их с плохими контрольными суммами.

+0

Я выводил только те, которые недействительны - следовательно, непредсказуемое содержание. – petr

1

Вы можете преобразовать все символы вне диапазона ASCII, которые должны исключать любые случайные escape-последовательности, которые изменят состояние вашего терминала.

print s.encode('string-escape') 

 Смежные вопросы

  • Нет связанных вопросов^_^