我正在使用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之间的字符区别?
答案 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!