带有±字符的Python subprocess.check_output

时间:2011-12-14 12:02:48

标签: python unicode

我正在使用subprocess.check_output调用MS DOS命令行应用程序从应用程序返回stdout字符串。

check_ouput的返回信息是关于刚刚运行的命令的信息,一个包含我之后的结果的新行和另一个新行。具体来说,返回字符串如下所示:

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

问题是在第一个换行符之后的\ xf1,该字符意味着是一个±(\ xb1),但总是以ñ(\ xf1)的形式返回,我无法理解为什么。

如果我在命令行中手动运行命令,我会得到±,正如我所料,所以我认为命令行应用程序没有错。

在短期内我可以用\ xb1替换任何我发现的\ xf1,但它是一个黑客,我宁愿防止它而不是解决它。

任何人都知道为什么命令行和python之间的字符区别?

2 个答案:

答案 0 :(得分:2)

MS DOS aplications使用与Windows Latin(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

答案 1 :(得分:1)

您正在运行的程序可能使用的是另一种编码,而不是您在python脚本中使用的编码。如果我是对的,并且您发现它是哪种编码,则可以使用.decode(<origin-encoding>).encode(<target-encoding>)方法绕过该过程。

编辑:我似乎找到了一个候选编码:

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

请注意,这并不能保证它对所有可能的输出都是正确的,只是它可能,并且它适用于±字符...

Edit2:当我在使用编解码器时,jsbueno得出了相同的结论,但是对于为什么这个编解码器可能是您需要使用的“历史视角”...

HTH!