3 回答

TA貢獻1851條經驗 獲得超3個贊
我得到了這個字典:
task_formatted.append(str(item['entity']))
我將其轉換為 a str,然后將其附加到列表中,以便我可以輕松地將其傳遞給我的模板
這段代碼并沒有像你想象的那樣做。
>>> entity = {'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}
>>> str(entity)
"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"
當你調用str字典(或列表)時,你不會得到調用str字典的每個鍵和值的結果:你得到每個鍵和值的代表。在這種情況下,這意味著“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。

TA貢獻1876條經驗 獲得超7個贊
你做錯了。
<td>{{item[0].decode('utf-8')}}</td>
你為什么添加decode
?這是錯誤的。我建議您不要放置任何轉換功能。UTF-8 可以正常工作(我認為這是默認設置)。在任何情況下,您都沒有解碼. 您正在將字符串編碼為 UTF-8(“編碼”:您使用代碼 UTF-8,“解碼”:從特定的編碼值到語義值:實際上在 python 中,您不應該關心字符串在內部如何編碼 [BTW 一種內部編碼,一種 UTF-8、latin1、UTF-16 或 UTF-32,根據對整個字符串進行編碼的最有效方法])。
只需刪除decode('utf-8')
. 在python代碼上,你不應該關心編碼和解碼,而應該關心輸入和輸出:使用三明治規則。這將極大地簡化字符串、邏輯的處理,并避免大多數錯誤

TA貢獻1744條經驗 獲得超4個贊
我找到了解決我的問題的方法:
unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))
首先,我用 str() 將我的 dict 轉換為一個字符串,然后在導入 unicodedata 后我用 unicode('str' , 'utf-8') end finaly 將它轉換為 UTF-8 Unicode 我使用 unicodedata.normalize()
希望它會幫助人們
添加回答
舉報