【问题标题】:How to fix: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 18: invalid start byte如何修复:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 18: invalid start byte
【发布时间】:2020-08-03 23:49:06
【问题描述】:

我正在尝试使用套接字制作远程外壳。一些命令的工作方式类似于netstatdir。但是当我尝试使用ping 时,会出现以下错误消息:

  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 18 中的字节 0x81:无效的起始字节

如果我尝试将消息编码为 utf-8,则此问题仅发生在服务器端。使用普通的字节字符串可以正常工作。我也尝试过先接收再编码字符串。

服务器端:

    while True:
        cmd = input(">>>")

        if len(str.encode(cmd)) > 0:
            connection.send(str.encode(cmd))

            client_response = str(connection.recv(1024), encoding = "utf-8")

            print (client_response, end = "")

客户端:

    while True:
        data = sock.recv(1024).decode("utf-8")

        proc = subprocess.Popen(shlex.split(data),
                                shell = True,
                                stdin = subprocess.PIPE,
                                stdout = subprocess.PIPE,
                                stderr = subprocess.PIPE)

        output = proc.stdout.read()+proc.stderr.read()

        sock.send(output)

也许有人可以给我小费。

【问题讨论】:

    标签: python network-programming


    【解决方案1】:

    顺便说一句,我认为您的客户端和服务器定义可能是错误的。客户端应该是接受用户输入并将其发送到服务器以执行的那个。但是,这与您的问题并不真正相关。

    不过,我将它们称为用户端(用户输入命令的地方)和执行端(进程运行的地方),希望能避免误解。


    我看到链接的执行端没有对输出进行编码,您只需按原样返回标准输出和错误。

    我建议在发送之前将其打印出来,以便您查看其中包含的内容,以及在用户端尝试转换之前将其打印出来

    # On exection side:
    output = proc.stdout.read()+proc.stderr.read()
    print('before send', output)
    
    # On user side:
    client_response = connection.recv(1024)
    print('got response', client_response)
    client_response = str(client_response, encoding = "utf-8")
    

    起始字节 0x81 作为 UTF-8 起始字节非常无效 - 它应该将最左边的位设置为 0 或将最左边的两位设置为 1。 0x81 是二进制的 1000 0001 所以不满足这个要求。

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 2018-10-15
      • 2021-11-24
      • 2022-09-26
      • 2020-03-12
      • 1970-01-01
      • 2020-03-01
      • 2020-05-08
      相关资源
      最近更新 更多