UnicodeEncodeError in Python when trying to encrypt and write to a file
<p>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: </p>

<pre><code>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 &lt;module&gt;
    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 &lt;undefined&gt;
</code></pre>

<p>And this is my code:</p>

<pre><code>import random

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

Encryption_Base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,./;:&lt;&gt;?'@#~]}[{=+-_)(*&amp;^%$Â£!`Â¬\|"
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) &gt; len(key):
        while len(phrase) &gt; len(key):
            length_to_add = len(phrase) - len(key)
            key = key + key[0:length_to_add]

    elif len(phrase) &lt; len(key):
        while len(phrase) &lt; 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 &gt; 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()
</code></pre>

<p>Thank you very much in advance as this is a little extension t the task I have been set in my A level class. 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. Thank you for your time :).</p>

<p>EDIT: If this helps it sometimes throws this error too:</p>

<pre><code>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 &lt;module&gt;
    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)
</code></pre>

<p>Okay. So anyone else viewing this post knows. All you need to do is put </p>

<p><code>import codecs</code> </p>

<p>at the top and then when you write the file type </p>

<p><code>encoding = "utf8"</code> </p>

<p>inside the write parenthesis. Hope I have helped your issue and thank you to all that helped me come to this conclusion :-).</p>

python encryption unicode python-unicode