我正在運行一個控制檯應用程序,該應用程序將數據從房屋周圍的各種傳感器接收。有時傳輸會中斷,因此數據包沒有意義。當發生這種情況時,數據包的內容被輸出到終端會話。然而,發生的事情是,在輸出錯誤的數據包時,它包含了改變當前終端窗口的字符集的字符,將任何文本(除了數字)都渲染爲不可讀的亂碼。防止數據打印中的終端字符集開關
在保留大部分特殊字符的同時過濾錯誤數據包的最佳方法是什麼?究竟是什麼序列可以改變終端的行爲?
我還想補充一點,除了亂碼輸出之外,應用程序仍然可以正常工作。
我正在運行一個控制檯應用程序,該應用程序將數據從房屋周圍的各種傳感器接收。有時傳輸會中斷,因此數據包沒有意義。當發生這種情況時,數據包的內容被輸出到終端會話。然而,發生的事情是,在輸出錯誤的數據包時,它包含了改變當前終端窗口的字符集的字符,將任何文本(除了數字)都渲染爲不可讀的亂碼。防止數據打印中的終端字符集開關
在保留大部分特殊字符的同時過濾錯誤數據包的最佳方法是什麼?究竟是什麼序列可以改變終端的行爲?
我還想補充一點,除了亂碼輸出之外,應用程序仍然可以正常工作。
您的終端可能對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