Проблема заключается в том, что большинство обобщающих материалов исчезнет во время компиляции.
Одним из распространенных решений является сохранение типа во время создания объекта.
Для краткого введения в поведение типа Erasure java прочтите эту страницу
Я получил этот диктат:
task_formatted.append(str(item['entity']))
Я преобразую его в
blockquote >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
.
Я нашел решение для своей проблемы:
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 ()
Надеюсь, это поможет людям