我正在运行一个控制台应用程序,该应用程序将数据从房屋周围的各种传感器接收。有时传输会中断,因此数据包没有意义。当发生这种情况时,数据包的内容被输出到终端会话。然而,发生的事情是,在输出错误的数据包时,它包含了改变当前终端窗口的字符集的字符,将任何文本(除了数字)都渲染为不可读的乱码。防止数据打印中的终端字符集开关
在保留大部分特殊字符的同时过滤错误数据包的最佳方法是什么?究竟是什么序列可以改变终端的行为?
我还想补充一点,除了乱码输出之外,应用程序仍然可以正常工作。
我正在运行一个控制台应用程序,该应用程序将数据从房屋周围的各种传感器接收。有时传输会中断,因此数据包没有意义。当发生这种情况时,数据包的内容被输出到终端会话。然而,发生的事情是,在输出错误的数据包时,它包含了改变当前终端窗口的字符集的字符,将任何文本(除了数字)都渲染为不可读的乱码。防止数据打印中的终端字符集开关
在保留大部分特殊字符的同时过滤错误数据包的最佳方法是什么?究竟是什么序列可以改变终端的行为?
我还想补充一点,除了乱码输出之外,应用程序仍然可以正常工作。
您的终端可能对ANSI escape codes做出了响应。 为了防止无意中影响到终端的数据,你可以打印数据的repr
,而不是数据本身:
例如,
good = 'hello'
bad = '\033[41mRED'
print('{!r}'.format(good))
print('{!r}'.format(bad))
产量
'hello'
'\x1b[41mRED'
而
print(good)
print(bad)
收益率
(顺便说一句,打字reset
将重置终端。)
这看起来像我在找的东西,谢谢! – petr 2013-04-04 15:40:12
当你得到一个数据包输出之前,检查它的有效性。一种可能性是检查数据包中的每个字符是否可打印,即输出前的十进制数为32-127。或者向数据包添加校验和并拒绝任何校验和不正确的数据。
我只输出那些无效的内容 - 因此不可预知的内容.. – petr 2013-04-04 15:40:36
您可以转换ASCII范围之外的所有字符,以消除任何会改变终端状态的杂散转义序列。
print s.encode('string-escape')
将输出输出到'cat -v'。 – choroba 2013-04-04 14:36:22