如何正确地将编码更改为 cp866?

How to correctly change encoding to cp866?

我正在尝试打印 UTF-8 和 cp866 进程输出。

我的代码:

if "sendcmd " in message.text:
    command = message.text.replace("sendcmd ", "")
    process = os.popen(command)
    answer = process.read()
    #print(answer.decode('utf-8').encode('cp866'))
    by = bytes(answer, 'utf-8')
    print(type(by))
    print(repr(by))
    process.close()

之后我明白了:

<class 'bytes'>
b'b\'\xe2\x80\x9c\xd0\xb1\xd0\x87\xd2\x90\xd0\xb5: \xd0\x8b\xd0\xb2\xd0\x87\xd0\xb0\xc2\xa0\xd1\x9e\xc2\xab\xd2\x90\xc2\xad \xd0\xb1\xd0\x81\xd0\x88\xc2\xad\xc2\xa0\xc2\xab \xc2\xa7\xc2\xa0\xd1\x9e\xd2\x90\xd0\xb0\xd0\xb8\xd2\x90\xc2\xad\xd0\x81\xd0\xbf \xd0\x87\xd0\xb0\xc2\xae\xd0\xb6\xd2\x90\xd0\xb1\xd0\xb1\xd0\xb3 "whatever.exe" \xd0\xb1 \xd0\x81\xc2\xa4\xd2\x90\xc2\xad\xd0\xb2\xd0\x81\xd0\xb4\xd0\x81\xd0\x84\xc2\xa0\xd0\xb2\xc2\xae\xd0\xb0\xc2\xae\xc2\xac 3720.\n\'

我知道我需要将编码更改为cp866,但我不明白如何实现它=(

更新:这段代码没有帮助:

uni = type(by), repr(by)
print(uni.encode('ascii', 'ignore'))

os.popenread 方法 returns str,过程的输出会自动解码。 subprocess.Popen类似于os.popen,可以自定义;它 returns 原始 bytes 而不是 str 文本:

from subprocess import Popen, PIPE

if "sendcmd " in message.text:
    ...
    process = Popen(command, stdout=PIPE)
    answer = process.communicate()[0]          # (stdout, stderr)
    print(answer.decode('cp866'))

在内部,os.popen 使用 subprocess 模块,您可能需要稍微更改 command 参数。检查 Popendocumentation