使用空格时的UnicodeEncodeError

时间:2016-02-15 15:57:38

标签: python-3.x unicode python-unicode vigenere

我创建了一个vigenere密码然后进行编码和解码,但在这种情况下,编码的字被写入文本文件,而deocoded部分读取编码的字并对其进行解码。问题是当我在消息或关键字中输入空格时(我们都将其转换为ascii并添加或删除)时出现错误。

我找到问题的根源[我认为]:http://imgur.com/a/6T8hf [imgur链接显示问题的2个屏幕截图]

我将读取和写入编码的单词的部分转换为注释,并将编码的单词打印到shell中,通过这样做,代码在消息和关键字中使用空格进行编码没有问题。然而,当我取消注释它们并使程序将编码的消息写入文本文件时,它会出现错误,说明" '字符表'不能编码字符"。如果有人可以提供帮助,我会非常感激!

encode="" # encoded text is saved in this variable
decode="" # decoded text is saved in this variable
encodedTextSaved="" # what the read encoded text from the text file is saved in 
decodedText = "" # When the encoded text is read back in from the file it goes in this variable
from itertools import cycle

def encrypt(message,keyWord): #defines the variable named 'encrypt'
    def encryptLetter(letterKey):
        letter,keyWord=letterKey
        return chr(ord(letter)+ord(keyWord)) # adds the ascii value of letter and the KeyWord togther and converts them to a character 
    keySeq=cycle(keyWord)
    return "".join(map(encryptLetter,zip(message,keySeq)))

def decrypt(message,keyWord): # defines the variable named 'decrypt'
    def decryptLetter(letterKey):
        letter,keyWord=letterKey
        return chr(ord(letter)-ord(keyWord)) # takes away the the ascii value of letter and the KeyWord togther and converts them to a character 
    keySeq=cycle(keyWord)
    return "".join(map(decryptLetter,zip(message,keySeq)))

start = input("Do you want to start this ingenuitive program (y/n): ")
if start == 'y':
    print()    
    while 1==1:
        decision=input('Do you wish to Encrypt(1) or Decrypt(2) a message or Quit(3):  ')
        if decision == '1':
            while 1==1:
                text=input("Enter text message to encode: ")
                if text == '':
                    print()
                    print("Enter Something!")
                    print()
                else: break
            while 1==1:
                keyWord=input("Enter keyword : ").lower()# Enter the message to be encoded / made sure that the input is turned all to lower case
                if keyWord == '':
                    print()
                    print("Enter Something!")
                    print()
                else: break
            encode = encrypt(text, keyWord) # runs the defined encrypt variable with the inputs 'text' and 'keyWord'
            myFile = open('data.txt', 'w')  # This opens the file called 'data.txt' so we can write to it
            myFile.write(encode) #writes the encoded word to the text file named 'data.txt'

            myFile.close
           #print ("encoded word is --> " + encode)



        elif decision == '2':
            myFile = open("data.txt","r")  # This opens the file called 'data.txt' so we can read it
            encodedTextSaved=myFile.readlines()  # This reads the encoded text into the variable encodedTextSaved
            myFile.close()
            decodedText=encodedTextSaved[0]
            while 1==1:
                keyWord=input("Enter keyword : ").lower()# Enter the message to be encoded / made sure that the input is turned all to lower case
                if keyWord == '':
                    print()
                    print("Enter Something!")
                    print()
                else: break
            decode = decrypt(decodedText, keyWord)# runs the defined decrypt variable with the inputs 'decodedText' and 'keyWord'
            print ("the decoded text is > " + decode)
        elif decision == 'no' or 'No': # if the user does not want to carry on then it quits the program
            print("Okay then....Bye")
            break
        elif decision == '3': # if the user chooses option 3 it breaks the while loop and closes the program
            print()
            break
        else: print("Invalid") # if user enters anything that is not what the program asks for it gives the user a second chance as the input is 'invalid'



if start == 'n': # if the user enters 'n' it does not proceed with the code and quits it 
    print()
    print("We hope that you shall use this program again in the not so distant future")

1 个答案:

答案 0 :(得分:1)

您的加密使用的是文本文件的默认编码不支持的字符。在Python 3中,文本字符串是Unicode,因此在将它们写入文件时指定编码。 utf8处理所有Unicode字符,因此是一个不错的选择。还要确保调用 myFile.close(缺少括号):

myFile = open('data.txt', 'w',encoding='utf8')
myFile.write(encode)
myFile.close()

在回读数据时指定相同的编码:

myFile = open("data.txt","r",encoding='utf8')