Зашифрованная ошибка Python «UnicodeEncodeError»

#python #python-3.x #unicode

Вопрос:

Я попытался создать код для имитации регистра.

Пользователь, например, выбирает «создать учетную запись» и вводит имя пользователя и пароль в текст с именем username.txt

Эта часть работает, но теперь я попытался зашифровать пароль, но я сократил:

«Файл «C:ProgramFilesWindowsAppsPythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0libencodingscp1252.py», строка 19, в кодировке кодеки возврата.charmap_encode(ввод,собственные ошибки,таблица кодирования)[0] Ошибка UnicodeEncodeError: кодек «charmap» не может кодировать символ «x95» в позиции 2: символ сопоставляется с «неопределенным».

Но если я использую свою программу для шифрования в одиночку, это сработает

мой код:

 # coding: utf-8

import colorama
from colorama import Fore, Back, Style
import os
import time
import platform
import shutil
import sys
import _socket
import socket
from Cryptage import *

#-------------------------------------------------------------------------------------------------

cle= open("cle.txt","r", encoding="utf-8")
cle=cle.read()
colorama.init(autoreset = True)
Boucle = 1
Pseudo = ""
encoded_string = ''

#-------------------------------------------------------------------------------------------------


def Clean():
    if platform.system() == "Windows":
        os.system("cls")
    elif platform.system() == "Linux":
        os.system("clear")

#-------------------------------------------------------------------------------------------------

def Acceuil():

    Clean()
    print(Fore.BLUE "<===ACCEUIL===>")
    print(Fore.BLUE "---------------------------------------------------------------------")
    print(Fore.BLUE "1. Se connecter")
    print(Fore.BLUE "2. S'inscrire")
    print(Fore.BLUE "3. Quitter")
    print(Fore.BLUE "---------------------------------------------------------------------")
    choix = input()

    if choix =='1':
        Connexion()
    
    elif choix =='2':
        Register()
    
    elif choix =='3':
        Clean()
        print("Fin du programme...")
        time.sleep(2.4)
        sys.exit()

    else:
        Clean()
        print(Fore.RED   "invalide")
        colorama.init(autoreset = True)

    #-------------------------------------------------------------------------------------------------

def Register():

    Clean()

    print(Fore.BLUE "<===INSCRIPTION===>")
    print(Fore.BLUE "---------------------------------------------------------------------")
    Pseudo, MDP = input(Fore.BLUE "Pseudo, MDP: ").split()


    TxtUser = "{Pseudo2}.txt".format(Pseudo2=Pseudo)
    CheminBase = "C:\Users\yuris\Desktop\Python\GestionDeCompte\{TxtUser2}".format(TxtUser2=TxtUser)
    CheminArriver = "C:\Users\yuris\Desktop\Python\GestionDeCompte\Users\{TxtUser2}".format(TxtUser2=TxtUser)

    MDPcrypted = encode(cle, MDP)

if os.path.exists(CheminArriver):

    Clean()
    print(Fore.RED "Le Pseudo",Fore.RED Pseudo,Fore.RED "Existe deja")
    input()

 
else:

    NewUser = open(TxtUser,"x")
    NewUser.close()

    NewUser = open(TxtUser,"a")
    NewUser.write("Pseudo: ")
    NewUser.write(Pseudo)
    NewUser.write("! ")

    NewUser.write("MDP: ")
    NewUser.write( MDPcrypted)
    NewUser.write("!")
    NewUser.close()

    shutil.move(CheminBase,CheminArriver)
    print(Fore.BLUE "Déplacement vers connexion...")
    time.sleep(2.4)
    Connexion()

        #-------------------------------------------------------------------------------------------------

def Connexion():

    Clean()
    print(Fore.BLUE "<===CONNEXION===>")
    print(Fore.BLUE "---------------------------------------------------------------------")
    Pseudo, MDP = input(Fore.BLUE "Pseudo, MDP: ").split()
    print(Fore.BLUE "---------------------------------------------------------------------")

    TxtUser = "{Pseudo2}.txt".format(Pseudo2=Pseudo)
    CheminArriver = "C:\Users\yuris\Desktop\Python\GestionDeCompte\Users\{TxtUser2}".format(TxtUser2=TxtUser)

    if os.path.exists(CheminArriver) :

        MDPregister = "{MDP2}!".format(MDP2=MDP)
        UserConnect = open(CheminArriver,"r")
    
        for ligne in  UserConnect:
            if MDPregister in ligne:
                MenuPrincipal()
            else:
                print(Fore.RED "Le Pseudo ou le MDP est invalide")
                input()
 
    else:
        print(Fore.RED "Le Pseudo ou le MDP est invalide")
        input()

#-------------------------------------------------------------------------------------------------

def MenuPrincipal():
    while Boucle != 0:

        Clean()
   
        print(Fore.GREEN "Bienvenue",Fore.GREEN Pseudo)
        input()
 
#-------------------------------------------------------------------------------------------------

while Boucle != 0:

    Acceuil()
    print("")
 

И это моя программа для шифрования пароля:

 # coding: utf-8
# vigenere cipher

#--------------------------------------------------------------------------------

cle= open("cle.txt","r", encoding="utf-8")
cle=cle.read()

#--------------------------------------------------------------------------------
        
def encode(cle, string):
    encoded_chars = []
    for i in range(len(string)):
        key_c =cle[i % len(cle)]
        encoded_c = chr(ord(string[i])   ord(key_c) % 256)
        encoded_chars.append(encoded_c)
    encoded_string = ''.join(encoded_chars)
    return encoded_string

def decode(cle, string):
    encoded_chars = []
    for i in range(len(string)):
        key_c = cle[i % len(cle)]
        encoded_c = chr((ord(string[i]) - ord(key_c)   256) % 256)
        encoded_chars.append(encoded_c)
    encoded_string = ''.join(encoded_chars)
    return encoded_string
 

(Повторно:Программа Изменена)

Ответ №1:

Ваша первая строка должна гласить # coding: utf-8 или coding=utf-8 (вынуть en ), или указать, когда вы читаете в cle этом cle = open("cle.txt", "r", encoding="utf-8") . Вы используете кодек, отличный от utf-8.

Комментарии:

1. Это не работает

2. Я вижу изменения в вашем вопросе; мне трудно воспроизвести ошибку, которую вы получаете (это работает для меня), так как у вас, похоже, есть некоторые локальные модули, импортированные и используемые в вашем коде. Можете ли вы создать воспроизводимый пример первого блока кода, который вы опубликовали?

3. Первая строка указывает кодировку исходного файла и не имеет ничего общего с чтением других файлов. Кодировка по умолчанию для исходного файла Python 3 в любом случае является UTF-8, поэтому строка не нужна. encoding также действует для этой строки. См.раздел Объявления кодировки .