Nach dem Upload von Dateien, die Umlaute im Dateinamen enthalten, liefert Django folgenden Fehler:
[Sat Mar 26 22:18:53 2011] [error] [client x.x.x.x] UnicodeEncodeError: ‚ascii‘ codec can’t encode character u’\xf6′ in position 17: ordinal not in range(128)
Ursache hierfür ist, dass der Dateiname Umlaute enthält, die mit UTF-8 encodiert sind – Python bzw. Django allerdings kein UTF-8 verarbeiten will.
Apache2 wird unter Debian standardmäßig mit „LANG=C“ gestartet – er berücksichtigt also keinerlei Locales.
Um UTF-8 auch im Dateisystem verarbeiten zu können (os.path() o.ä.), muss dem Apache die korrekte Locale mitgeteilt werden.
Falls noch nicht geschehen, muss das Paket „locales“ installiert werden:
aptitude install locales
Nun die nötige Änderung in der Datei /etc/apache2/envvars vornehmen:
## The locale used by some modules like mod_dav
export LANG=C
## Uncomment the following line to use the system default locale instead:
. /etc/default/locale
(Entfernen des Kommentarzeichens in der letzten hier aufgeführten Zeile)
Die genannte Datei /etc/default/locale wird über folgenden Befehl konfiguriert:
dpkg-reconfigure locales
Hier muss darauf geachtet werden, dass Locales mit UTF-8 selektiert werden – und in der zweiten Auswahl eine entsprechende als Standard gesetzt wird. Zu empfehlen ist entweder en_US.UTF-8 oder de_DE.UTF-8.
Somit befindet sich in der Datei /etc/default/locale beispielsweise folgender Inhalt:
# File generated by update-locale
LANG=de_DE.UTF-8
Nach dem Neustart des Apache sollte Python respektive die Django-Anwendung nun auch Dateien mit UTF-8-Umlauten verarbeiten können.