3

次のコードは正しく機能します。

from jinja2 import Template

mylist = ['some text \xc3']

template = Template('{{ list }}')

print template.render(list=mylist)

実行すると、次のように出力されます。

['some text \xc3']

それでも、実際のリスト要素を印刷しようとすると失敗します:

template = Template('{{ list[0] }}')

print template.render(list=mylist)

エラーは次のとおりです。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)

リスト全体が印刷されるのと同じ方法で個々のリスト要素を印刷する方法を見つけたいと思います。非ASCII文字は \x 表記で表されます。

4

4 に答える 4

3

From Jinja docs:

"Jinja2 is using Unicode internally which means that you have to pass Unicode objects to the render function or bytestrings that only consist of ASCII characters."

mylist = [u'some text \xc3']
于 2012-12-21T08:42:26.940 に答える
2

エンコードされたファイルを開いてデコードしないでください。

エンコーディングがヘッダーで指定されていない場合は、curl からエンコーディングを読み取り (-iまたは-Hオプションを使用して)、HTTP ヘッダーまたは出力ファイルを解析する必要があります。

または、curl の代わりにrequests、ファイルへの書き込みを必要としないライブラリを使用できます。Web リソースをフェッチすると、次のようになります。

>>> r = requests.get('http://python.org')
>>> r.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML...

Wherecontentは、HTTP 仕様に従って既にエンコードされています。

最後のアプローチとして、エンコーディングを推測して未知の文字を置き換えることができます。これは、実装が最も簡単なソリューションです。例えば:

with codecs.open(filename, encoding='utf-8', errors='replace') as fobj:
    ...

あなたのアプローチは常に情報を失います(非ASCII文字がある場合)。最初の 2 つのアプローチは決して行わず、最後のアプローチは推測されたエンコーディングが間違っている場合のみです。

于 2012-06-11T06:39:50.490 に答える
0

私はそれを考え出した。することが鍵ですstr.encode('string-escape')

だから、私はこれをしました:

template = Template('{{ list[0].encode("string-escape") }}')

そして、それはうまくいきました。

于 2012-06-06T06:15:39.323 に答える
0

jlaは私の場合に適しています。

私はpythonソースファイルにutf-8を使用しているので、uプレフィックスを使用して問題を解決しました。

于 2013-12-12T10:00:37.130 に答える