2015-01-29 2 views
0

Мне нужно отправить поля из запроса mysql в шаблон HTML-шаблона. Это мой питон код:Поля mysql для HTML-шаблона (ошибка декодирования unicode python)

class Estilos(webapp2.RequestHandler): 
def get(self): 
    db = ..... 
    cursor = db.cursor() 
    cursor.execute('SELECT estilo, n1 FROM estilos;') 
    lista = [] 
    for row in cursor.fetchall(): 
    lista.append([cgi.escape(row[0]), 
        cgi.escape(row[1]) 
        ]) 

    variables = {'lista':lista} 

    template = JINJA_ENVIRONMENT.get_template('estilo.html') 
    self.response.write(template.render(variables)) 
    db.close()  

Это мой шаблон HTML:

<html> 
    <form action="/sign" method="post"> 
    <br /> 
    <div>Estilo: <select name="estilo" style="width:400px"> 
     {% for e in lista %} 
       <option value="{{ e }}">{{ e }}      
       </option> 
      {% endfor %} 
      </select> 
      </div> 

    <div> N1: <select name="n1" style="width:400px"> 
     {% for e in lista %} 
       <option value="{{ e }}" >{{ e }}      
       </option> 
      {% endfor %} 
      </select> 
      </div> 

    <div><input type="submit" value="Selecionar"></div> 
    </form>  

Этот код показывает всю строку в поле выбора: [ 'STRONG Pale Ale', 'ALE']

Когда я изменить вид выберите значение

    <option value="{{ e[0] }}">{{ e[0] }}      
       </option>  

тогда я получаю ошибку юникода декодирования.

<option value="{{ e[0] }}">{{ e[0] }} UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 1: ordinal not in range(128)  

Я пытался кодировать cgi.escape в utf8, но я не могу заставить его работать. Кто-нибудь знает, как это исправить? Каков правильный способ кодирования строки?

+0

Пожалуйста, отредактируйте Q, чтобы показать 'repr' заблуждающейся строки' - не зная, состоит ли она из байтов или строк юникода, или для кодировки, если какие-то байтовые строки, затрудняет вам помощь. –

+0

Если я печатаю str(), я получаю: {'n1': 'ALE', 'estilo': 'STRONG PALE ALE'}. Если я напечатаю repr(), я получаю: {'n1': «ALE», «estilo»: «STRONG PALE ALE» »} –

+0

Принимая буквально каждую деталь, которую вы сообщаете (т. Е. Предполагая, что вы не делали абсолютно никаких ошибок в отчетности и смешали разные версии вашего кода). Я в тупике: это '\ xc4' (верхний регистр A с умляутом, если, например, латинский-1), появляется из ниоткуда. Попробуйте использовать 'cgi.escape (row [0] .decode ('ascii', 'replace'))' & c и посмотреть, где вопросительные знаки заменяют символы, которые вы ожидали (если 'decode' ничего не показывает, попробуйте' encode' вместо этого, но что, скорее всего, даст вам тот же UnicodeDecodeError, который вы получаете сейчас). –

ответ

0

Принимая в буквальном смысле каждую деталь, о которой сообщается (т. Е. Предполагая, что вы не делали абсолютно никаких ошибок при составлении отчетов или смешивали разные версии вашего кода), я был бы в тупике: \xc4 (в верхнем регистре A с umlaut, если, например, латинский-1) ниоткуда

Однако OP подтвердил в комментарии, что он был на самом деле перепутать различные версии кода, в этом случае ...:

хорошая идея, чтобы использовать cgi.escape(row[0].decode('ascii','replace')) & с, и см. где вопросительные знаки заменяют символы, которые ожидались. OP подтвердил в комментарии, что это сработало для них.

Для полноты мышления будущих читателей с подобными проблемами: если decode ничего не показывает, что они могли бы попробовать encode вместо этого, но это, скорее всего, даст тот же UnicodeDecodeError первоначально сообщенный ОП.

Смежные вопросы