Ошибка UnicodeDecodeError: Кодекс utf-8 не может расшифровать байты 0x92 в позиции 1: неправильный начальный байт

Я тута делаю прогу для удалённой работы на своём втором пк, но тут при выполнении команды dir вылезает ошибка:

Traceback (most recent call last):
  File "main.py", line 34, in <module>
    my_Conn.run()
  File "main.py", line 30, in run
    self.reliable_send(commandResult)
  File "main.py", line 11, in reliable_send
    json_data = json.dumps(data)
  File "C:\Python27\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Python27\lib\json\encoder.py", line 195, in encode
    return encode_basestring_ascii(o)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 1: invalid start byte

Код Сервера:

import socket, json

class Listener:
    def __init__(self, ip, port):
        listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        listener.bind((ip, port))
        listener.listen(0)
        print("[+] Waiting for incoming connection")
        self.conn, address = listener.accept()
        print("[+] Got a connection from " + str(address))

    def reliable_send(self, data):
        json_data = json.dumps(data)
        self.conn.send(json_data)

    def reliable_receive(self):
        json_data = ""
        while True:
            try:
                json_data = json_data + self.conn.recv(1024)
                return json.loads(json_data)
            except ValueError:
                continue

    def execRemote(self, command):
        self.reliable_send(command)
        return self.reliable_receive()

    def run(self):
        while True:
            command = raw_input(">> ")
            result = self.execRemote(command)
            print(result)

my_Listener = Listener("***.***.**.***", ####)
my_Listener.run()

Код Клиента(второго пк):

import socket
import subprocess
import json

class Main:
    def __init__(self, ip, port):
        self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connection.connect((ip, port))

    def reliable_send(self, data):
        json_data = json.dumps(data)
        self.connection.send(json_data)

    def reliable_receive(self):
        json_data = ""
        while True:
            try:
                json_data = json_data + self.connection.recv(1024)
                return json.loads(json_data)
            except ValueError:
                continue

    def executeCommand(self, command):
        return subprocess.check_output(command, shell=True)

    def run(self):
        while True:
            command = self.reliable_receive()
            commandResult = self.executeCommand(command)
            self.reliable_send(commandResult)
        connection.close()

my_Conn = Main("***.***.**.***", ####)
my_Conn.run()

Ошибка в этом месте:

def reliable_send(self, data):
        json_data = json.dumps(data)
        self.connection.send(json_data)

Ответы (1 шт):

Автор решения: GrAnd

Кодировка в которой выводит результат команда dir на русской Windows наверняка cp866. А питон пытается вызвать функцию преобразования в кодировку utf-8. Вот простой тест:

>>> x = subprocess.check_output('dir', shell=True)
>>> print(x[:37])
b' \x92\xae\xac \xa2 \xe3\xe1\xe2\xe0\xae\xa9\xe1\xe2\xa2\xa5 D \xa8\xac\xa5\xa5\xe2 \xac\xa5\xe2\xaa\xe3 Data\r'
>>> print(x[:37].decode())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 1: invalid start byte
>>> print(x[:37].decode('cp866'))
 Том в устройстве D имеет метку Data
>>>

Т.е. функция subprocess.check_output() вернула bytes, а json пытается преобразовать её в строку в кодировке по-умолчанию, т.е. в UTF8, и у него не получается. Отсюда вывод - надо ему помочь и самому заранее сделать преобразование с использованием нужной кодировки.

→ Ссылка