UnicodeEncodeError:'ascii'编解码器无法编码字符

vor*_*pyg 36 django file-upload nginx django-admin django-uploads

上传具有非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)
Run Code Online (Sandbox Code Playgroud)

查看完整堆栈跟踪.

我用MySQL和nginx以及FastCGI运行Django 1.2.

这是根据Django Trac数据库修复的问题,但我仍然遇到问题.欢迎任何有关如何修复的建议.

编辑:这是我的图像字段:

image = models.ImageField(_('image'), upload_to='uploads/images', max_length=100)
Run Code Online (Sandbox Code Playgroud)

aka*_*ola 39

对于在使用Supervisor运行Django时遇到此问题的任何人,解决方案是将以下内容添加到supervisordSupervisor配置部分:

environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"
Run Code Online (Sandbox Code Playgroud)

这解决了在Debian Squeeze上运行的Supervisor 3.0a8中的问题.

  • 确保/etc/init.d/supervisor停止并且/etc/init.d/supervisor启动以使更改生效.只是重新启动将无法正常工作. (5认同)
  • 您可以使用 `supervisorctl reread` 和 `supervisorctl restart myservice` 强制读取配置文件,而不是停止和启动整个守护进程。 (2认同)
  • 可悲的是,我不能完全回答这个问题,你真的保存我的星期天,谢谢! (2认同)

Lin*_*n B 24

在必须在只接受ascii的地方(如控制台或路径)中显示unicode字符串的情况下,您必须告诉Python您希望它替换非ascii字符的最佳工作量.

>> 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'
Run Code Online (Sandbox Code Playgroud)

管理员可以通过谨慎处理Django模板来防止编码问题,但如果你曾经添加过自定义列并忘记将值转换为ascii,或者你为模型覆盖str方法而忘记这样做,你会得到相同的错误,阻止模板渲染.

如果将此字符串保存到您的(希望是utf8)数据库中就没有问题,看起来您正在尝试上传使用具有非ascii字符的实体标题的文件.


Ale*_*bov 12

希望这会有所帮助.就我而言,我正在通过daemontools运行django.

设置

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
Run Code Online (Sandbox Code Playgroud)

在执行manage.py之前的运行脚本中解决了uploads filename的问题


vor*_*pyg 12

在调查了一些后,我发现我没有在我的主Nginx配置文件中设置charset:

http {
  charset  utf-8;
}
Run Code Online (Sandbox Code Playgroud)

通过添加上述内容,问题就消失了,我认为这是处理此问题的正确方法.

  • 这只有在nginx直接运行后端代码时才有效.假设它是像gunicorn或uwsgi这样的代理,你必须配置wsgi服务器的环境才能使用UTF-8.将此添加到您的Nginx配置不会有任何损害,但它可能无法解决您的问题. (4认同)

Paw*_*man 10

akaihola的回答很有帮助.对于那些通过upstart脚本管理uWSGI运行django app的人,只需将这些行添加到/etc/init/yourapp.conf

env LANG="en_US.utf8"
env LC_ALL="en_US.UTF-8"
env LC_LANG="en_US.UTF-8"
Run Code Online (Sandbox Code Playgroud)

它解决了我的问题.

  • 谢谢!这是解决我问题的方法!`env LANG ="en_US.UTF-8"env LC_ALL ="en_US.UTF-8"env LC_LANG ="en_US.UTF-8"`.请注意,它是`env`而不是`export`.这是在System V脚本(/etc/init/xxx.conf)下使用的语法.这个错误耗费了我几个小时. (3认同)