37

ASCII 以外の文字を含むファイルをアップロードすると、UnicodeEncodeError が発生します。

Exception Type: UnicodeEncodeError at /admin/studio/newsitem/add/
Exception Value: 'ascii' codec can't encode character u'\xf8' in position 78: ordinal not in range(128)

完全なスタック トレースを参照してください。

MySQL と nginx と FastCGI で Django 1.2 を実行しています。

これは、 Django Trac データベースに従って修正された問題ですが、まだ問題があります。修正方法に関する提案は大歓迎です。

編集:これは私の画像フィールドです:

image = models.ImageField(_('image'), upload_to='uploads/images', max_length=100)
4

12 に答える 12

41

SupervisorでDjango を実行しているときにこの問題に遭遇した場合、解決策は、たとえば、 supervisordSupervisor の構成のセクションに次を追加することです。

environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"

これにより、Debian Squeeze で実行されている Supervisor 3.0a8 の問題が解決されました。

また、次のコマンドを実行して、Supervisor が構成を再読み込みすることを確認します。

supervisorctl reread
supervisorctl restart myservice

(ありがとう@Udi)


新興企業の場合は、次を追加します/etc/init/myservice.conf

env LANG="en_US.utf8"
env LC_ALL="en_US.UTF-8"
env LC_LANG="en_US.UTF-8"`

(@Andrii Zarubinに感謝します。詳細については、Upstartドキュメントの環境変数を参照してください)

于 2012-06-11T19:04:15.137 に答える
24

ascii のみを受け入れる場所 (コンソールやパスなど) に Unicode 文字列を表示する必要がある状況では、非 ascii 文字のベスト エフォートを置き換えることを Python に指示する必要があります。

>> problem_str = u'This is not all ascii\xf8 man'
>> safe_str = problem_str.encode('ascii', 'ignore')
>> safe_str
'This is not all ascii man'

エンコーディングの問題は、Django テンプレートの慎重な処理によってアドミンで防止されますが、カスタム列を追加して値を ascii に変換するのを忘れた場合、またはモデルのstrメソッドをオーバーライドしてこれを行うのを忘れた場合は、次のようになります。同じエラーが発生し、テンプレートのレンダリングが妨げられました。

この文字列が (できれば utf8) データベースに保存されていれば問題はありません。ASCII 文字以外のエンティティのタイトルを使用するファイルをアップロードしようとしているようです。

于 2010-09-16T02:26:01.397 に答える
14

これが役立つことを願っています。私の場合、daemontools を介して django を実行しています。

設定

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

manage.pyを実行する前にスクリプトを実行すると、アップロードファイル名の問題が解決されました

于 2011-07-04T14:59:59.997 に答える
12

これをさらに調査した後、メインのNginx構成ファイルに文字セットを設定していないことがわかりました。

http {
  charset  utf-8;
}

上記を追加することで問題がなくなり、これが正しい対処方法だと思います。

于 2011-09-29T19:30:11.560 に答える
11

akaihola の回答は役に立ちました。upstart スクリプトで管理される uWSGI で django アプリを実行する場合は、これらの行を /etc/init/yourapp.conf に追加するだけです。

env LANG="en_US.utf8"
env LC_ALL="en_US.UTF-8"
env LC_LANG="en_US.UTF-8"

それは私にとって問題を解決しました。

于 2015-02-26T12:26:50.087 に答える
4

もう少しコードを見ずに言うのは難しいですが、それはこの質問に関連しているようです:djangoのデフォルトのファイルベースのバックエンドを介してファイルを保存しようとしたときのUnicodeDecodeError

言及されているDjangoチケットを見ると、「UnicodeEncodeErrorが発生した場合」のデプロイメントドキュメントに類似したものに従う必要があるようです:
https ://docs.djangoproject.com/en/1.4/howto/deployment/modpython/#if- you-get-a-unicodeencodeerror

(これはApache / mod_python用ですが、UTF-8ではないファイルシステムエンコーディングの同じ根本的な問題であり、nginxを使用する場合にも同様の修正があります)

編集:私が知ることができることから、このnginxモジュールは同等の修正になります:http ://wiki.nginx.org/NginxHttpCharsetModule

于 2010-09-15T15:47:37.920 に答える
4

コードの書き換えを回避するもう 1 つの便利なオプションは、Python のデフォルトのエンコーディングを変更することです。

virtualenvを使用している場合は、変更 (または存在しない場合は作成)env/lib/python2.7/sitecustomize.pyして追加できます。

import sys
sys.setdefaultencoding('utf-8')

または、実稼働システムにいる場合は、同じことを行うことができます/usr/lib/python2.7/sitecustomize.py

于 2014-11-20T12:41:35.317 に答える
4

前に述べたように、それはロケールに関連しています。たとえば、 を使用gunicornしてサービスを提供するdjango application場合init.d、ロケールを設定できるスクリプト (または、私の場合は runit スクリプト) がある場合があります。

ファイルのアップロードで UnicodeEncodeError を解決するにはexport LC_ALL=en_US.UTF8、アプリを実行するスクリプトに次のようなものを入れます。

たとえば、これは私のものです(gunicornandを使用runit):

#!/bin/bash
export LC_ALL=en_US.UTF8
cd /path/to/app/projectname
exec gunicorn_django -b localhost:8000 --workers=2

また、ビューでこれを使用して、テンプレートでロケールを確認できます。

import locale
data_to_tpl = {'loc': locale.getlocale(), 'lod_def': locale.getdefaultlocale()}

そして{{loc}} - {{loc_def}}、テンプレートに表示するだけです。

ロケール設定に関する詳細情報が表示されます! それは私にとって非常に役に立ちました。

于 2012-03-09T15:37:20.787 に答える
3

Python 2.7.8 と Django 1.7 を使用して、インポートして問題を解決しました。

from __future__ import unicode_literals

と使用force_text()

from django.utils.encoding import force_text
于 2014-10-04T08:30:16.037 に答える