Юникод ошибка колба jinja2 - PullRequest
0 голосов
/ 19 марта 2019

Я хочу создать веб-страницу с Python на колбе, все работает очень хорошо, и я бы очень рекомендовал колбу. Но когда дело доходит до Unicode et кодирование всегда сложно между python, веб-страницей и т.д ..

Итак, у меня есть форма, которую я публикую на определенном маршруте колбы, я получаю свои значения и мне нужно сделать небольшую упаковку, чтобы мои переменные были в хорошем порядке и все.

Я получил этот дикт:

            task_formatted.append(str(item['entity']))

Я преобразую его в str, затем добавляю в список, чтобы можно было легко передать его моему шаблону

Я ожидаю, что str будет отображаться как UTF-8 на веб-странице страница питона:

  # -*- coding: utf-8 -*- 

HTML-страница:

  <meta charset="utf-8"/>

Затем я распечатываю их на своей странице, используя jinja:

            {% for item in task %}
            <tr>
              <td>{{item[0].decode('utf-8')}}</td>
              <td>{{item[1].decode('utf-8')}}</td>
              <td>{{item[2]}}</td>
              <td>{{item[3]}}</td>
              <td>{{item[4]}}</td>
              <td><button id="taskmodal1"></td>
            </tr>
            {% endfor %}

но мой товар [0] .decode ('utf-8') и мой предмет [1] .decode ('utf-8')

печатают:

{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm \ xc3 \ xa9'}

вместо

{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}

Я пробовал несколько способов с .encode ('utf-8') на стороне питона с unicode (str) с render_template (). Encode ('utf-8'), и я вырос из идей.

Если быть честным, я думаю, что это то, чего я не понимал в Unicode, поэтому я хотел бы получить некоторые объяснения (не ссылку на документацию, потому что я, скорее всего, уже прочитал их) или некоторые решения, чтобы заставить его работать,

очень важно, чтобы моя программа могла писать правильно, если str использует его после вызовов js http.

Спасибо

PS: я использую python2

Ответы [ 3 ]

1 голос
/ 20 апреля 2019

Я получил этот дикт:

task_formatted.append(str(item['entity']))

Я преобразую его в str, затем добавляю его в список, чтобы я мог легко передать его моему шаблону

Этот код не делает то, что вы думаете.

>>> entity = {'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}
>>> str(entity)
"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"

Когда вы вызываете str в словаре (или списке), вы не получаете результат вызова str для каждого ключа и значений словаря: вы получаете repr каждого ключ и значение. В этом случае это означает, что 'Test-Asset commé' был преобразован в 'Test-Asset comm \ xc3 \ xa9' таким способом, который трудно изменить.

>>> str(entity).decode('utf-8')  # <- this doesn't work.
u"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"

Если вы хотите визуализировать свои словари в шаблоне, используя {{ item }}, вы можете использовать модуль json для их сериализации вместо str. Обратите внимание, что вам нужно преобразовать json (тип str) в экземпляр unicode, чтобы избежать UnicodeDecodeError при рендеринге шаблона.

>>> import json
>>> template = jinja2.Template(u"""<td>{{item}}</td>""")
>>> j = json.dumps(d, ensure_ascii=False)
>>> uj = unicode(j, 'utf-8')
>>> print template.render(item=uj)
<td>{"type": "Asset", "id": 1404, "name": "Test-Asset commé"}</td>

Некоторые общие замечания / вынос:

  • Не используйте str (или unicode) для сериализации контейнеров, таких как словари или списки; используйте такие инструменты, как json или pickle .
  • Убедитесь, что любые строковые литералы, которые вы передаете jinja2, являются экземплярами unicode, а не str
  • При использовании Python2, если есть вероятность, что ваш код будет обрабатывать не-ascii значения, всегда используйте unicode, никогда не используйте str.
0 голосов
/ 21 марта 2019

Я нашел решение для моей проблемы:

unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))

сначала я преобразую свой dict в строку с помощью str (), затем я превращаю его в UTF-8 Unicode с Unicode ('str', 'utf-8') и окончательно после импорта unicodedata я использую unicodedata.normalize ()

Надеюсь, это поможет людям

0 голосов
/ 19 марта 2019

Вы делаете что-то не так.

<td>{{item[0].decode('utf-8')}}</td>

Почему вы добавляете decode? Это не верно. Я рекомендую вам не ставить какую-либо функцию преобразования. UTF-8 будет работать нормально (и я думаю, что это по умолчанию). В любом случае, вы не декодируете . Вы кодируете строку в UTF-8 («кодирование»: вы используете код UTF-8 , «декодирование»: от конкретного значения кодирования к семантическому значению: на самом деле в Python вас не должно волновать) о том, как строки внутренне кодируются [Кстати, внутреннее кодирование, вроде UTF-8, latin1, UTF-16 или UTF-32, в соответствии с наиболее эффективным способом кодирования всей строки]).

Просто удалите decode('utf-8'). В коде Python вам следует заботиться не о кодировании и декодировании, а о вводе и выводе: используйте правило сэндвича. Это значительно упростит обработку строк, логику и позволит избежать большинства ошибок

...