2013-04-04 74 views
2

我正在運行一個控制檯應用程序,該應用程序將數據從房屋周圍的各種傳感器接收。有時傳輸會中斷,因此數據包沒有意義。當發生這種情況時,數據包的內容被輸出到終端會話。然而,發生的事情是,在輸出錯誤的數據包時,它包含了改變當前終端窗口的字符集的字符,將任何文本(除了數字)都渲染爲不可讀的亂碼。防止數據打印中的終端字符集開關

在保留大部分特殊字符的同時過濾錯誤數據包的最佳方法是什麼?究竟是什麼序列可以改變終端的行爲?

我還想補充一點,除了亂碼輸出之外,應用程序仍然可以正常工作。

+0

將輸出輸出到'cat -v'。 – choroba 2013-04-04 14:36:22

回答

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

(順便說一句,打字reset將重置終端。)

+0

這看起來像我在找的東西,謝謝! – petr 2013-04-04 15:40:12

0

當你得到一個數據包輸出之前,檢查它的有效性。一種可能性是檢查數據包中的每個字符是否可打印,即輸出前的十進制數爲32-127。或者向數據包添加校驗和並拒絕任何校驗和不正確的數據。

+0

我只輸出那些無效的內容 - 因此不可預知的內容.. – petr 2013-04-04 15:40:36

1

您可以轉換ASCII範圍之外的所有字符,以消除任何會改變終端狀態的雜散轉義序列。

print s.encode('string-escape')