【问题标题】:result = result.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 321: invalid start byteresult = result.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 321: invalid start byte
【发布时间】:2021-11-24 20:07:23
【问题描述】:

我有这个代码:

        try:
            execute = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            print('execute', execute)
            result = execute.stdout.read() + execute.stderr.read()
            print('normal result', result)
            result = result.decode('utf-8')
            print('decoded result:  ', result)
            reliable_send(result)
        except:
            reliable_send('Something went wrong ;- (')

诸如 whoami 或 arp-a 之类的一些命令工作正常,我将结果接收到我的服务器,但是当我尝试获取 dir 或 ipconfig 时,此行 result = result.decode('utf-8') 抛出异常,有什么问题?我做错了吗?

错误:

result = result.decode('utf-8') UnicodeDecodeError:“utf-8”编解码器无法解码位置 321 中的字节 0xff:无效起始字节

【问题讨论】:

  • 有哪些例外?是编码错误还是命令返回错误?
  • 代码运行到 ( result = result.decode('utf-8') ) 行,甚至不打印 ( print('decoded result: ', result) ) 但抛出 except 并运行 (可靠发送('出了点问题;-(')),所以我猜解码有问题,但我不知道是什么
  • 是的,我知道,但是出了什么问题?不幸的是,一张悲伤的脸并不是一个很好的错误消息,您能否更改代码以便打印异常并将其发布在问题中?
  • result = result.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 322: invalid start byte 我猜就是这样
  • 为什么你认为进程的输出是一个utf-8编码的字节序列?因为这是唯一一次使用 .decode('utf-8') 才有意义。

标签: python python-3.x sockets tcp


【解决方案1】:

我找到了答案。

result.decode('ISO-8859-1')

它有点用,有时它会返回一些奇怪的东西,但总的来说它对我来说很好用。如果有人知道更好的解决方案,我很想知道。

【讨论】:

    【解决方案2】:

    在您的示例中 subprocess.Popen 已以字节流模式打开,因此您需要知道将这些字节作为文本进行解释的编码。

    如果指定了encoding 或errors,或将text=True 传递给subprocess.Popen,则文件对象stdin、stdout 和stderr 将在文本模式下使用指定的编码和错误打开,如上面@987654321 中所述@。

    您也可以尝试PYTHONIOENCODING 以获得正确的结果。

    我不时遇到编码检测问题,并找到了一个有用的控制台工具enca。

    【讨论】:

    • print() 不会引发错误,decode() 会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2022-09-26
    • 2018-10-15
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多