Юникод ошибка колба jinja2

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

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

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

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

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

Я бы ожидал str будет отображаться как UTF-8 на странице Python веб-страницы:

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

html page:

  <meta charset="utf-8"/>

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

[113 ]

но мой элемент [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 ') на стороне Python с Unicode (str) с render_template (). encode ('utf-8') И у меня растут идеи.

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

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

Спасибо

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

0
задан snakecharmerb 20 April 2019 в 15:04
поделиться

2 ответа

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

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 [1118 ] каждого ключа и значения. В этом случае это означает, что '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
ответ дан snakecharmerb 20 April 2019 в 15:04
поделиться

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

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
ответ дан Aurele Collinet 20 April 2019 в 15:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: