Getting ASCII encoding where unicode wanted under Py3k

Jonathan Hayward jonathan.hayward at pobox.com
Mon May 13 11:59:33 EDT 2013


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.

The error that I am getting is:

UnicodeEncodeError: 'ascii' codec can't encode character '\u0161' in
position 1442: ordinal not in range(128)
      args = ('ascii', "Content-Type: text/html\n\n<!DOCTYPE
html>\n<html>\n...ype='submit'>\n </form>\n </body>\n</html>", 1442,
1443, 'ordinal not in range(128)')
      encoding = 'ascii'
      end = 1443
      object = "Content-Type: text/html\n\n<!DOCTYPE
html>\n<html>\n...ype='submit'>\n </form>\n </body>\n</html>"
      reason = 'ordinal not in range(128)'
      start = 1442
      with_traceback = <built-in method with_traceback of
UnicodeEncodeError object>

(And that was posted to StackOverflow--one shot in the dark answer so far.)

My code is below. What should I be doing differently to be, in the most
immediate sense, calls to '''%(foo)s''' % locals()?

#!/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())


-- 
[image: Christos Jonathan Hayward] <http://jonathanscorner.com/>
Christos Jonathan Hayward, an Orthodox Christian author.

*Amazon <http://amazon.com/author/cjshayward>* • Author
Bio<http://jonathanscorner.com/author/>
 • *Author Site <http://cjsh.name/>* •
*Email<christos.jonathan.hayward at gmail.com>
* • Facebook <http://www.facebook.com/christos.jonathan.hayward> • Fan
Page<http://fan.cjshayward.com/>
 • Google Plus <http://jonathanscorner.com/plus> •
LinkedIn<http://www.linkedin.com/in/jonathanhayward>
 • *Professional <http://jonathanhayward.com/>* •
Twitter<http://twitter.com/JonathansCorner>
 • *Web <http://jonathanscorner.com/>* • What's
New?<http://jonathanscorner.com/>
If you read just *one* of my books, you'll want *The Best of Jonathan's
Corner <http://www.amazon.com/dp/1478219912>*.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20130513/aaa0a86e/attachment.html>


More information about the Python-list mailing list