<div dir="ltr">I have a Py3k script, pasted below. When I run it I get an error about ASCII codecs that can't handle byte values that are too high.<div><br></div><div>The error that I am getting is:</div><div><br></div>
<div><pre class="" style="margin-top:0px;margin-bottom:10px;padding:5px;border:0px;font-size:13.600000381469727px;vertical-align:baseline;background-color:rgb(238,238,238);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif;overflow:auto;width:auto;max-height:600px;color:rgb(0,0,0);line-height:17.600000381469727px">
<code style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif"><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(43,145,175)">UnicodeEncodeError</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">:</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> </span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">'ascii'</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> codec can</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">'t encode character '</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">\u</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">0161</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">' in position 1442: ordinal not in range(128) 
      args = ('</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">ascii</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">', "Content-Type: text/html\n\n<!DOCTYPE html>\n<html>\n...ype='</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">submit</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">'>\n </form>\n </body>\n</html>", 1442, 1443, '</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">ordinal </span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(0,0,139)">not</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> </span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(0,0,139)">in</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> range</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">(</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">128</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">)</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">') 
      encoding = '</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">ascii</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">' 
      end = 1443 
      object = "Content-Type: text/html\n\n<!DOCTYPE html>\n<html>\n...ype='</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">submit</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">'>\n </form>\n </body>\n</html>" 
      reason = '</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">ordinal </span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(0,0,139)">not</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> </span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(0,0,139)">in</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent"> range</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">(</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">128</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent">)</span><span class="" style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;color:rgb(128,0,0)">' 
      start = 1442 
      with_traceback = <built-in method with_traceback of UnicodeEncodeError object></span></code></pre></div><div style>(And that was posted to StackOverflow--one shot in the dark answer so far.)</div><div style><br>
</div><div style>My code is below. What should I be doing differently to be, in the most immediate sense, calls to '''%(foo)s''' % locals()?</div><div><pre style="color:rgb(0,0,0);word-wrap:break-word;white-space:pre-wrap">
#!/usr/bin/python3

import cgi
import cgitb;cgitb.enable()
import os
import pickle
import sys

cgi_form = cgi.FieldStorage()

message = ''

def get_cgi(field, default = ""):
    return cgi_form.getfirst(field, default)

try:
    sys.stderr.write('abc: 1')
    input_file = open(
      os.path.join(os.path.dirname(__file__), '../../../russian/pickled'), 'rb')
    sys.stderr.write('abc: 2')
    state = pickle.load(input_file)
    sys.stderr.write('abc: 3')
    state['changed'] = False
    sys.stderr.write('abc: 4')
    state['loaded'] = True
    sys.stderr.write('abc: 5')
except IOError:
    state = {}
    state['phrases'] = []
    state['changed'] = True
    state['loaded'] = False
#except UnicodeDecodeError:
    #state = {}
    #state['phrases'] = []
    #state['changed'] = True
    state['loaded'] = False

if get_cgi('russian') and get_cgi('english'):
    state['phrases'].append([get_cgi('russian'), get_cgi('english')])
    message = 'Your changes have been saved.'
    state['changed'] = True
elif get_cgi('english'):
    state['phrases'].append([None, get_cgi('english')])
    message = 'Your change has been saved.'
    state['changed'] = True

if get_cgi('mode') == 'edit':
    to_delete = []
    for index in range(len(state['phrases'])):
        if get_cgi('russian_' + str(index), None) != None:
            state['phrases'][index][0] = get_cgi('russian_' + str(index))
        if get_cgi('english_' + str(index), None) != None:
            state['phrases'][index][1] = get_cgi('english_' + str(index))
        if get_cgi('delete_' + str(index), None) != None:
            to_delete.insert(0, index)
            #to_delete.append(index)
    #to_delete.sort(lambda a, b: -cmp(a, b))
    for element in to_delete:
        del state['phrases'][element]
    state['changed'] = True

sys.stderr.write('abc: ' + repr(state))

if state['changed']:
    output_file = open(
      os.path.join(os.path.dirname(__file__), '../../../russian/pickled_new.' +
        str(os.getpid())), 'wb')
    pickle.dump(state, output_file)
    output_file.close()
    os.rename(
      os.path.join(os.path.dirname(__file__), '../../../russian/pickled_new.' +
        str(os.getpid())),
      os.path.join(os.path.dirname(__file__), '../../../russian/pickled'))

if get_cgi('mode') == 'add':
    print('''Content-type: text/html

<!DOCTYPE html>
<html>
    <head>
        <meta charset='UTF-8' />
        <style type="text/css">
            body
                {
                font-family: Verdana, Arial, sans;
                }
            input[type=text]
                {
                width: 100%%;
                }
            div.message
                {
                background-color: silver;
                }
        </style>
    </head>
    <body>
        <div class='message'>
            %(message)s
        </div>
        <form action='' method='POST'>
            <p><strong>Russian:</strong><br />
            <input type='text' id='russian' name='russian'></p>

            <p><strong>English:</strong><br />
            <input type='text' id='english' name='english'></p>

            <p><input type='submit'>
        </form>
        <script src='/include/jquery.js'></script>
        <script>
            jQuery('#Russian').focus();
        </script>
    </body>
</html>''' % locals())
elif get_cgi('mode') == 'edit':
    edit_table = '<table>'
    edit_table += '<thead>'
    edit_table += '<th>Russian</th>'
    edit_table += '<th>English</th>'
    edit_table += '<th>Delete</th>'
    edit_table += '</thead>'
    edit_table += '<tbody>'
    for index in range(len(state['phrases'])):
        if state['phrases'][index][0]:
            russian = state['phrases'][index][0].replace('"', "''")
        else:
            russian = None
        english = state['phrases'][index][1].replace('"', "''")
        edit_table += '<tr>'
        edit_table += '<td>'
        if russian != None:
            edit_table += '''<input type='text' name='russian_%(index)d'
            id='russian_%(index)d' value="%(russian)s">''' % locals()
        edit_table += '</td>\n'
        edit_table += '<td>'
        edit_table += '''<input type='text' name='english_%(index)d'
        id='english_%(index)d' value="%(english)s">''' % locals()
        edit_table += '<td>'
        edit_table += '''<input type='checkbox' name='delete_%(index)d'
        id='delete_%(index)d'>''' % locals()
        edit_table += '</td>\n'
        edit_table += '</tr>'
    print ('''Content-Type: text/html

<!DOCTYPE html>
<html>
    <head>
        <title>Edit Phrases</title>
        <meta charset='utf-8' />
    </head>
    <body>
        <form action='' name='edit' id='edit' />
            <input type='hidden' name='mode' value='edit' />
            %(edit_table)s
            <input type='submit'>
        </form>
    </body>
</html>''' % locals())
else:
    text = ''
    for phrase in state['phrases']:
        if phrase[0]:
            text += ('<p title="' + phrase[1].replace('"', "''") + '">' +
              phrase[0] + '</p>')
        else:
            text += '<h2>' + phrase[1] + '</h2>'

    print ('''Content-type: text/html

<!DOCTYPE html>
<html>
    <head>
        <title>___________</title>
        <meta charset='utf-8'>
        <style type='text/css'>
            body
                {
                font-family: Verdana, Arial, sans;
                }
            div
                {
                background-color: #ffff00;
                }
        </style>
        <link rel='stylesheet' type='text/css'
        href='/js/jquery-ui-1.10.2.custom/css/smoothness/jquery-ui-1.10.2.custom.css'
        />
    </head>
    <body>
        %(text)s
        <script src='/js/vendor/jquery-1.8.2-min.js'></script>
        <script
        src='/js/jquery-ui-1.10.2.custom/js/jquery-ui-1.10.2.custom.min.js'></script>
        <script>
            jQuery(document).tooltip();
        </script>
    </body>
</html>''' % locals())</pre><div><br></div>-- <br><div dir="ltr"><table cellpadding="0" cellspacing="0" style="font-family:Verdana,Arial,sans;font-variant:small-caps"><tbody><tr><td style="padding:20px">
<a href="http://jonathanscorner.com/" target="_blank"><img src="http://jonathanscorner.com/images/signature.png" height="88" width="100" border="0" alt="Christos Jonathan Hayward"></a></td><td style="padding:20px 20px 20px 0px">
<div style="margin-bottom:8px">Christos Jonathan Hayward, an Orthodox Christian author.</div><div style="margin-top:2px;margin-bottom:8px;padding:4px 6px;background-color:rgb(255,255,170);border:1px solid silver"><p style="margin:0px">
<span style="color:silver"><strong><a href="http://amazon.com/author/cjshayward" target="_blank">Amazon</a></strong> • <a href="http://jonathanscorner.com/author/" title="Author biography" target="_blank">Author Bio</a></span><span style="font-size:small;color:silver"> </span><span style="font-size:small;color:rgb(192,192,192)">• <b><a href="http://cjsh.name/" style="color:rgb(17,85,204)" target="_blank">Author Site</a></b></span><span style="color:silver"> • <strong><a href="mailto:christos.jonathan.hayward@gmail.com" title="christos.jonathan.hayward@gmail.com" target="_blank">Email</a></strong> • <a href="http://www.facebook.com/christos.jonathan.hayward" title="@christos.jonathan.hayward" target="_blank">Facebook</a> • <a href="http://fan.cjshayward.com/" title="Facebook fan page" target="_blank">Fan Page</a> • <a href="http://jonathanscorner.com/plus" title="@Christos Jonathan Hayward" target="_blank">Google Plus</a> • <a href="http://www.linkedin.com/in/jonathanhayward" title="@jonathanhayward" target="_blank">LinkedIn</a> </span><span style="color:rgb(192,192,192)">•</span><span style="color:silver"> </span><strong style="color:silver"><a href="http://jonathanhayward.com/" target="_blank">Professional</a></strong><span style="color:silver"> •  </span><a href="http://twitter.com/JonathansCorner" title="@JonathansCorner" target="_blank">Twitter</a><span style="color:silver"> • </span><strong style="color:silver"><a href="http://jonathanscorner.com/" title="JonathansCorner.com" target="_blank">Web</a></strong><span style="color:silver"> • </span><a href="http://jonathanscorner.com/" title="New creations added to the website." target="_blank">What's New?</a></p>
</div><div style="margin-bottom:8px">If you read just <strong>one</strong> of my books, you'll want <strong><a href="http://www.amazon.com/dp/1478219912" target="_blank">The Best of Jonathan's Corner</a></strong>.</div>
</td></tr></tbody></table></div>
</div></div>