UnicodeEncodeError: кодек «ascii» не может кодировать символ - PullRequest
36 голосов
/ 15 сентября 2010

При загрузке файлов с не-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)

См. трассировка полного стека .

Я запускаю Django 1.2 с MySQL, nginx и FastCGI.

Эта проблема устранена в соответствии с базой данных Django Trac , но проблема сохраняется. Любые предложения по исправлению приветствуются.

РЕДАКТИРОВАТЬ: Это мое поле изображения:

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

Ответы [ 12 ]

39 голосов
/ 11 июня 2012

Для тех, кто сталкивается с этой проблемой при запуске Django с Supervisor , решение заключается в добавлении, например. в разделе supervisord конфигурации супервизора:

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

Это решило проблему для меня в Supervisor 3.0a8, работающем на Debian Squeeze.

24 голосов
/ 16 сентября 2010

В ситуациях, когда вы должны отобразить строку юникода в месте, которое принимает только ascii (например, консоль или путь), вы должны указать 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'

Проблемы с кодированием предотвращаются в администраторе осторожной обработкой шаблонов Django, но если вы когда-либо добавляли пользовательские столбцы и забыли преобразовать значения в ascii, или вы переопределили метод str для модели и забудьте об этом, вы получите ту же ошибку, предотвращающую рендеринг шаблона.

Если бы эта строка была сохранена в вашей (надеюсь, utf8) базе данных, проблем не было бы, похоже, вы пытаетесь загрузить файл, который использует заголовок объекта, который не является символом ascii.

12 голосов
/ 29 сентября 2011

После более подробного изучения я обнаружил, что я не установил кодировку в своем основном конфигурационном файле Nginx:

http {
  charset  utf-8;
}

При добавлении вышеупомянутого проблема исчезла, и я думаю, чтоправильный способ решения этой проблемы.

12 голосов
/ 04 июля 2011

Надеюсь, это поможет. В моем случае я запускаю django через daemontools.

Настройка

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

в скрипте запуска перед выполнением manage.py решена проблема с загрузкой имени файла

10 голосов
/ 26 февраля 2015

Акайхола ответ был полезным. Для тех, кто запускает приложение django с uWSGI, управляемым через сценарий upstart, просто добавьте эти строки в ваш /etc/init/yourapp.conf

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

Это решило проблему для меня.

4 голосов
/ 20 ноября 2014

Еще одна полезная опция, позволяющая избежать переписывания кода, - это изменить кодировку по умолчанию для python.

Если вы используете virtualenv , вы можете изменить (или создать, если не существует) env/lib/python2.7/sitecustomize.py и добавьте:

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

или, если вы находитесь в производственной системе, вы можете сделать то же самое для /usr/lib/python2.7/sitecustomize.py

4 голосов
/ 09 марта 2012

Как уже говорилось ранее, это связано с локалью. Например, если вы используете gunicorn для обслуживания django application, у вас может быть скрипт init.d (или, как я, скрипт runit), где вы можете установить локаль.

Чтобы решить UnicodeEncodeError с загрузкой файла, вставьте что-то вроде export LC_ALL=en_US.UTF8 в ваш скрипт, который запускает ваше приложение.

Например, это мое (с использованием gunicorn и 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}} в вашем шаблоне.

У вас будет больше информации о ваших региональных настройках! Это было очень полезно для меня.

4 голосов
/ 15 сентября 2010

Трудно сказать, не увидев немного больше кода, но похоже, что он связан с этим вопросом: UnicodeDecodeError при попытке сохранить файл через файловый бэкэнд по умолчанию для django .

Просмотр черезВ билете 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

3 голосов
/ 04 октября 2014

Используя Python 2.7.8 и Django 1.7, я решил свою проблему, импортировав:

from __future__ import unicode_literals

и используя force_text():

from django.utils.encoding import force_text
3 голосов
/ 09 мая 2014

Если вы используете django и python 2.7, это исправит это для меня:

@python_2_unicode_compatible
class Utente(models.Model):

см. https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.encoding.python_2_unicode_compatible

...