Python 子进程 check_output 解码特殊字符

6

我遇到了一些关于Python编码的问题。当我尝试执行以下代码时:

subprocess.check_output("ipconfig", shell=True)

当我运行它时,输出中会含有特殊字符,例如:

"Statut du m\x82dia"
"M\x82dia d\x82connect\x82"

我是法语人。

当我尝试在末尾使用.decode()进行解码时,它会给我返回以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 78: invalid start byte

我尝试使用.decode("utf-8"),花了几个小时来尝试编码和解码,但是我找不到答案。 互联网上的所有信息都没有起作用。也许我只是太蠢了,但是有什么方法可以消除这些解码错误并打印我的特殊字符呢?

谢谢。


2
你可以通过在参数中添加 encoding="437"encoding="850" 来解决它,但我不会满意这个答案,因为它没有解释为什么代码页是什么。 - Josh Lee
1
@JoshLee 哇,使用.decode(sys.stdout.encoding) 真是太棒了!感谢您!您能否将您的回答变成“官方”回答之类的东西,这样我就可以确认它了吗?再次感谢您,您让我的一天都美好起来了,因为我已经被困在这个问题上很长时间了^^" - Nim
Josh Lee所说的。FWIW,b"M\x82dia d\x82connect\x82".decode('cp437')返回'Média déconnecté';使用'cp850'解码可以得到相同的结果。 - PM 2Ring
还有locale.getpreferredencoding() - Josh Lee
@PM2Ring @JoshLee sys.getdefaultencoding() 返回 utf-8,所以它会出现与之前相同的错误。sys.getdefaultencoding() 返回 "mbcs",我不知道它是什么意思,但它不起作用,它将 \x82 转换为 \u201alocale.getpreferredencoding() 也是一样,返回 "cp1252"。但这不重要,我的问题已经得到回答,感谢你们两个 ^^ - Nim
显示剩余4条评论
1个回答

8

你是通过CMD调用命令的,它有Unicode模式和ANSI模式。"正确"的方式是调用Unicode模式,但你可以在子进程调用中添加encoding="437"encoding="850"来使其工作。这取决于你知道当前代码页是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接