Django und PythonIn 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.

Django und Unicode

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ß:-)

Autor seit 7 Jahren
12 Seiten
Laden ...
Fehler!