Unicode

Unicode in Python - kurz

Der Datentyp unicode in Python repräsentiert eine Sequenz von Unicode-Codepoints (ein Codepoint ist eine eindeutige Nummer für ein Schriftzeichen) und nicht einen String in einem bestimmten Encoding. unicode ist weder UTF-8, noch UTF-16, noch UTF-32 (das, was Microsoft leider als "Unicode" bezeichnet, ist UTF-16).

Grundlegende Speichereinheit des Computers ist allerdings ein Byte und kein Unicode-Codepoint, also müssen zur Ein-/Ausgabe Unicodestrings in Bytes umgewandelt werden. Dazu gibt es diverse Standards, die Encodings definieren, also Regeln, wie die Codepoints durch Bytes repräsentiert werden sollen. Jedes Unicode-Encoding (z.B. utf-8) kann alle Codepoints repräsentieren, während dies für andere Encodings (z.B. latin-1) nicht zutrifft.

Hinweis: Diese Ausführungen beziehen sich nur auf Byte<->Unicode-Encodings. Python kennt noch andere Encodings, die eine Byte-zu-Byte-Umwandlung darstellen (z.B. "zlib" zum Komprimieren von Strings), in diesen Fällen funktioniert das Kodieren etwas anders.

Die Umwandlung von einem Bytestring -- Typ str -- in einen Unicodestring nennt man dekodieren (Methode str.decode), die umgekehrte Umwandlung heißt kodieren (Methode unicode.encode). In beiden Fällen ist die Angabe des Encodings erforderlich, das der Bytestring besitzt bzw. erhalten soll. [[#fnref-27f6ef6cb8a12f59cde1bd1e884ec426fb4eac60|1]]

Falls beim Dekodieren der Bytestring ungültige Zeichen für das angegebene Encoding enthält, wird ein UnicodeDecodeError ausgelöst. Falls beim Enkodieren das Encoding einen Codepoint nicht repräsentieren kann, wird ein UnicodeEncodeError ausgelöst.

Pythons Standardencoding ist ASCII, d.h. das allen Encodings gemeinsame Subset. Wann immer ein Unicodestring übergeben wird, aber ein Bytestring erforderlich ist, wird er implizit nach ASCII umgewandelt!

Unicodestrings in Python-Quelltexten (also Literale wie u'abc', die ja in der Datei als Bytestrings vorliegen) werden beim Kompilieren dekodiert. Das verwendete Encoding ist standardmäßig ASCII, kann aber durch ein "coding cookie" am Beginn der Datei festgelegt werden: # coding: utf-8

Die längere Fassung steht unter Von Umlauten, Unicode und Encodings.

Umgang mit Daten

Der beste Weg, mit Daten umzugehen, ist der folgende:

Eine kurze Übersicht über externe Datenquellen und -ziele und die richtige Behandlung:

Quelle/Ziel

Stichwort

Behandlung

Usereingaben

raw_input()

Mit Terminalencoding (sys.stdin.encoding) dekodieren

Konsolenausgabe

print

print enkodiert automatisch mit sys.stdout.encoding, benutzt man sys.stdout.write(), muss man das selbst tun

GUI

pygtk

Viele GUI-Systeme haben eigene Regeln für Encodings. PyGTK zum Beispiel arbeitet mit UTF-8.

Dateinamen

os.listdir()

Unicode-Argument übergeben, dann bekommt man Unicode zurück, ansonsten sys.getfilesystemencoding() benutzen

Dateiinhalte

open()

codecs.open oder codecs.EncodedFile benutzen

Datenbanken

Unicode-Features der DB-Wrapper benutzen

Unicode-Zeichenketten können nur innerhalb von laufenden Programmen existieren. Wenn Du Daten einlesen oder ausgeben willst, dann müssen sie irgendwie kodiert werden, zum Beispiel als UTF-8. Wenn Du Unicode-Zeichenketten im Quelltext angibst, dann bewirkt das 'u' davor, dass Python diese Zeichenkette dekodiert, weil man Unicode ja nicht in einer Datei stehen haben kann, sondern immer nur eine Kodierung davon. Es wird die Kodierung zum dekodieren genommen, die oben in der Datei als spezieller Kommentar angegeben ist, oder ASCII, falls der Kommentar nicht im Quelltext steht.

-- Zitat von BlackJack

Links zum Thema

Tags: Unicode | Tipps | String

  1. Die Methode unicode.decode ist größtenteils sinnlos, während str.encode z. B. notwendig wird, wenn man Binär-String in Transferencodings wie Base64 übersetzen möchte. (1)

Unicode (zuletzt geändert am 2009-06-17 16:14:16 durch anonym)