2011-12-14 44 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

相关问题