2011-12-14 48 views
2

我正在使用調用MS DOS命令行應用程序的subprocess.check_output來從應用程序返回stdout字符串。帶有±字符的Python subprocess.check_output

check_ouput的返回信息是關於剛剛運行的命令的信息,包含結果的新行以及另一個新行。具體返回的字符串看起來是這樣的:

b'0ms: Channel.#0.Range.SelectedItem?\r\n\xf150 mV\r\n' 

問題是\ XF1的第一個換行符後,該字符意味着是一個±(\ XB1),但始終返回A N(\ XF1)和我無法弄清楚爲什麼。

如果我在命令行中手動運行命令,我會得到正如我所期望的那樣,所以我不認爲命令行應用程序有問題。

在短期內,我可以用\ xb1替換任何\ xf1,但是它只是一種黑客,我寧願防止它而不是解決它。

任何人有任何想法,爲什麼命令行和python之間的字符差異?

回答

1

很可能您正在運行的程序使用另一種編碼,而不是您在Python腳本中使用的編碼。如果我是對的,並且您知道它是哪種編碼,則可以使用.decode(<origin-encoding>).encode(<target-encoding>)方法規避該過程。

編輯:看來我發現了一個候選編碼:

>>> print s.decode('cp850') 
0ms: Channel.#0.Range.SelectedItem? 
±50 mV 

請注意,這並不能保證它是所有可能的輸出是正確的,只是它可能是,那它的工作原理爲±字符...

EDIT2:當我和編解碼器打打鬧鬧,jsbueno得出了相同的結論,但有一個「歷史的角度」至於爲什麼這個編解碼器可能是你需要使用的...

HTH!

+0

是,CP850開了竅,我只是沒有使用正確的編碼。 – Trevor 2011-12-14 12:36:41

2

MS DOS應用程序使用與Windows拉丁文(cp1252)或文明世界(web + unix:utf-8)不同的字符編碼 - 爲了向後兼容,它們使用CP850代碼頁。

所有您需要做的有一個適當的Python的Unicode從這個字符串是將其與CP850編碼解碼,像:

>>> print '0ms: Channel.#0.Range.SelectedItem?\r\n\xf150 mV\r\n'.decode("cp850") 
0ms: Channel.#0.Range.SelectedItem? 
±50 mV 
+0

那就是我正在尋找的編碼,我嘗試了一大堆解碼,但實際上都沒有工作。 – Trevor 2011-12-14 12:33:40

相關問題