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 ]

2 голосов
/ 23 июня 2015

Просто основываюсь на ответах из этой цепочки и других ...

У меня была такая же проблема с genericpath.py, выдающим UnicodeEncodeError при попытке загрузить имя файла без символов ASCII.

Я использовал nginx, uwsgi и django с python 2.7.

Все работало нормально локально, но не на сервере

Вот шаги, которые я сделал 1. добавил в / etc / nginx /nginx.conf (проблема не устранена)

http {
    charset utf-8;
}

Я добавил эту строку в etc / default / locale (не устранил проблему)

LANGUAGE="en_US.UTF-8"

Я следовал приведенным здесь инструкциямпод заголовком «Успех» https://code.djangoproject.com/wiki/ExpectedTestFailures (не устранил проблему)

aptitude install language-pack-en-base

Нашел по этому билету https://code.djangoproject.com/ticket/17816, в котором предлагалось проверить представление насервер к тому, что происходило с информацией о локали

На ваш взгляд

import locale
locales = "Current locale: %s %s -- Default locale: %s %s" % (locale.getlocale() + locale.getdefaultlocale())

В вашем шаблоне

{{ locales }}

Для меня вопросбыло то, что у меня не было локали и локали по умолчанию на моем сервере Ubuntu (хотя они были у меня на локальной машине разработки OSX), тогда файлы с именами / путями, отличными от ASCII, не будут корректно загружаться с python, вызывающим UnicodeEncodeError, но только нарабочий сервер.

Решение

Я добавил это как в конфигурационный файл uwsgi моего сайта, так и в мой админ сайта, например / etc / uwsgi-emperor / vassals / my-site-файл config-ini

env = LANG=en_US.utf8
0 голосов
/ 15 марта 2017

Ни один из ответов не сработал для меня (используя Apache в Ubuntu с Django 1.10);Я решил удалить акценты в имени файла (нормализовать), как показано ниже:

def remove_accents(value):
    nkfd_form = unicodedata.normalize('NFKD', str(value))
    return "".join([c for c in nkfd_form if not unicodedata.combining(c)])

uploaded_file = self.cleaned_data['data']

# We need to remove accents to get rid of "UnicodeEncodeError: 'ascii' codec can't encode character" on Ubuntu
uploaded_file.name = remove_accents(uploaded_file.name)
...