Ошибка 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, и у него не получается. Отсюда вывод - надо ему помочь и самому заранее сделать преобразование с использованием нужной кодировки.