Django und Unicode
Durch die beiden Methoden smart_str() und force_unicode() erleichtert Django den Umgang mit Bytestrings und Unicodestrings ungemein.In der Python 2.6 - die Version die Django im Moment unterstützt - werden 2 Arten von Strings unterschieden: Bytestrings vom Typ str und Unicodestrings vom Typ unicode. Beide sind von der Basisklasse basestring abgeleitet.
Ein Bytestring ist dabei eine Kette von aufeinanderfolgenden Bytes und repräsentiert eine Folge von Zeichen, die durch ein Encoding definiert wird. Das Default Encoding von Python ist ASCII, mit dem genau 128 Zeichen dargestellt werden. Generell kann Python mit über 100 verschiedenen Encodings umgehen, wie zum Beispiel Latin-1 für westeuropäische Sprachen oder KOI8R-R für Russisch.
Im Gegensatz dazu entsprechen Unicodestrings einer Folge von Unicode-Codepoints. Unicode selbst ist dabei kein Encoding, sondern ein Standard, der jedem Zeichen eine eindeutige Zahl - einen sogenannten Codepoint - zuordnet. Wie Unicode und Codepoints im Detail funktionieren, beschreibt der Artikel "Was eigentlich ist Unicode?". Auf jeden Fall bietet die Abstraktion von Bytes auf Codepoints bzw. Zeichen dem Programmierer viele Vorteile. Maschinen jedoch können mit Codepoints nicht viel anfangen, da diese intern mit Byte-Folgen arbeiten
Sollen also Daten von anderen Programmen verarbeitet werden - sei es wenn Daten über ein Netzwerk versendet, in Dateien gespeichert oder aus Datenbanken gelesen werden - müssen diese in Form von Bytestrings vorliegen. Deshalb sollten Unicodestrings für entsprechende Aktionen mit einem Kodierungsformat wie zum Beispiel UTF-8 in Bytestrings konvertiert werden.
Smart-String und Force-Unicode
Die beiden Methoden smart_str() und force_unicode() aus dem django.utils.encoding Modul sind für Konvertierungsgeschichten bestens geeignet, da sie das Handling mit Byte- und Unicode-Strings ungemein erleichtern. Sie machen genau das, was ihre Namen schon sagen:
Die Methode smart_str() konvertiert eine Eingabe in einen Bytestring im Gegensatz zur Methode force_unicode() die eine Eingabe in einen Unicode-String konvertiert. Die Methode smart_str() wird also verwendet, wenn ein UTF-8-enkodierter Bytestrom erzeugt werden soll, force_unicode() wird verwendet, wenn ein Unicode-String benötigt wird.
Zum Glück wird in Python 3 - und damit irgendwann auch in Django - das Leben einfacher, denn ab Python 3 gibt es nur noch Unicodestrings.
Einige dieser Informationen stammen aus dem englischen Artikel Unicode in the real world von James Bennett, der auf seinem Blog immer wieder mit genialen Artikeln zu glänzen weiß:-)
Bildquelle:
Paul-Georg Meister
(Eigene Homepage erstellen? Das is zu beachten)