简体   繁体   English

尝试加密和写入文件时Python中的UnicodeEncodeError

[英]UnicodeEncodeError in Python when trying to encrypt and write to a file

second post here (on the same code). 这里的第二篇文章(在相同的代码上)。 However this time it is a different issue. 然而这次是另一个问题。 It only happens every so often but it stumps me as to why. 它只是经常发生,但它让我知道为什么。 This is the output and error: 这是输出和错误:

Phrase to be encrypted: Hello world
Shift keyword, Word only: Hello

:-) :-) :-) Encrypting Phrase 10%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 20%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 30%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 40%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 50%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 60%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 70%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 80%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 90%... :-) :-) :-) 
:-) :-) :-) Encrypting Phrase 100%... :-) :-) :-) 
:-) :-) :-) Checking Security of encrypted phrase.... :-) :-) :-) 
:-) :-) :-) Done! :-) :-) :-) 

Here is your Encrypted Phrase:I?j!Qgea:~~[
Traceback (most recent call last):
  File "C:\Users\Isaac Scarisbrick\Downloads\Keyword Cipher_1.py", line 60, in <module>
    file.write (str(result) + " " + (Cipher))
  File "C:\Users\Isaac Scarisbrick\AppData\Local\Programs\Python\Python35-32\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-3: character maps to <undefined>

And this is my code: 这是我的代码:

import random

phrase = input('Phrase to be encrypted: ')
shift_key = input("Shift keyword, Word only: ")

Encryption_Base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,./;:<>?'@#~]}[{=+-_)(*&^%$£!`¬\|"
key_encryption = random.randint(0, 94)
Cipher = ''

for c in shift_key:
        if c in Encryption_Base:
            Cipher += Encryption_Base[(Encryption_Base.index(c)+key_encryption)%(len(Encryption_Base))]

def Keyword_Encryption(key, phrase):

    if len(phrase) > len(key):
        while len(phrase) > len(key):
            length_to_add = len(phrase) - len(key)
            key = key + key[0:length_to_add]

    elif len(phrase) < len(key):
        while len(phrase) < len(key):
            length_to_sub = len(key) - (len(key) - len(phrase))
            key = key[0:length_to_sub]

    else:
        pass

    shifted_phrase = ''
    for i in range(len(phrase)):
        new_letter = (ord(key[i]) - 96) + (ord(phrase[i]) - 96) + 96
        if new_letter > 1220:
            new_letter = chr(new_letter - 26)

        else:
            new_letter = chr(new_letter)

        shifted_phrase = shifted_phrase + new_letter
    return shifted_phrase

result = Keyword_Encryption(Cipher, phrase)
print (" ")
print (":-) " * 3 + "Encrypting Phrase 10%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 20%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 30%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 40%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 50%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 60%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 70%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 80%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 90%... " + ":-) " * 3)
print (":-) " * 3 + "Encrypting Phrase 100%... " + ":-) " * 3)
print (":-) " * 3 + "Checking Security of encrypted phrase.... " + ":-) " * 3)
print (":-) " * 3 + "Done! " + ":-) " * 3)
print (" ")
print ('Here is your Encrypted Phrase:' + (result) + (Cipher))

file = open("Encrypted.txt", "w")
file.write (str(result) + " " + (Cipher))
file.close()

Thank you very much in advance as this is a little extension t the task I have been set in my A level class. 非常感谢您提前,因为这是我在A级课程中设置的任务的一个小扩展。 There are some snippets of code in here which you may have seen before as there was an encryption program made in python which i took bits from. 这里有一些代码片段你可能已经看过,因为在python中有一个加密程序,我从中获取了一些代码。 Thank you for your time :). 感谢您的时间 :)。

EDIT: If this helps it sometimes throws this error too: 编辑:如果这有助于它有时也会抛出此错误:

Phrase to be encrypted: Hello World
Shift keyword, Word only: Hello
Traceback (most recent call last):
  File "C:\Users\Isaac Scarisbrick\Downloads\Keyword Cipher_1.py", line 42, in <module>
    result = Keyword_Encryption(Cipher, phrase)
  File "C:\Users\Isaac Scarisbrick\Downloads\Keyword Cipher_1.py", line 37, in Keyword_Encryption
    new_letter = chr(new_letter)
ValueError: chr() arg not in range(0x110000)

Okay. 好的。 So anyone else viewing this post knows. 所以看过这篇文章的其他人都知道。 All you need to do is put 所有你需要做的就是放

import codecs

at the top and then when you write the file type 在顶部,然后在您编写文件类型时

encoding = "utf8"

inside the write parenthesis. 在写括号内。 Hope I have helped your issue and thank you to all that helped me come to this conclusion :-). 希望我帮助你解决问题,并感谢所有帮助我得出这个结论的人:-)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM