[Python-de] Unicode - ein Vorschlag zur Gte

Georg Mischler schorsch at schorsch.com
Mon Dez 29 22:55:45 CET 2003


Gerson Kurz wrote:

> Da sind wir dann bei der alten Geschichte mit den Exceptions & den
> Fehlercodes - nennt mich Hanswurst, aber es gibt Fehler, die man ignorieren
> KANN.

Ich hoffe, du erwartest nicht von Python, dass es dir die
Entscheidung darueber abnimmt, welche Fehler das sind? Und was
genau "ignorieren" im Einzelfall heisst?

Der Entwickler weiss immer noch selber am besten, wie sein
Programm in verschiedenen Situationen reagieren soll. Wenn du es
einigermassen flexibel haben willst, dann kannst du dir leicht
etwas von der folgenden Art basteln.


def flex_encode(u, enc='iso-8859-1', replace=None, fmt=None):
    if replace != None and fmt != None:
        raise ValueError, '"replace" und "fmt" nur einzeln zulaessig'
    if type(u) == type(''): return u # potentiell gefaehrlich!
    try: return u.encode(enc)
    except UnicodeError:
        sl = []
        for uc in u:
            o = ord(uc)
            if o < 128: # ascii
                sl.append(chr(o))
            else:
                try: sl.append(uc.encode(enc)) # passt in's charset
                except UnicodeError:
                    if replace:
                        sl.append(replace) # ersetzen
                    elif fmt:
                        sl.append(fmt % ord(uc)) # konvertieren
    return ''.join(sl)


# Anwendung:

utest = unicode('abc', 'iso-8859-15')

# z.B. fuer Logfiles:

>>> print flex_encode(utest) # unpassende zeichen ignorieren
"abc"
>>> print flex_encode(utest, replace='?') # ersetzen
"abc?"
>>> print flex_encode(utest, fmt='\\x%x') # konvertieren
"abc\x20ac"

# fuer HTML:

>>> print flex_encode(utest, fmt='&#%d;')
"abc&#8364;"


Das ist natuerlich nicht fuer lange Texte optimiert, aber mit
etwas gesundem Menschenverstand wird sicher jeder eine fuer die
jeweilige Problemstellung angemessene Loesung hinkriegen.


> Unicode ist das eine Gebiet in Python, wo die Sprache von ihrer
> pragmatischen Handhabung "als richtig erwiesener Konzepte" abweicht
> (anders als z.B. in der Handhabung der "Objektorientierung"

Wenn ich einen Unicode-Text in ein Charset konvertiere, und es
befinden sich danach Zeichen ausserhalb dieses Charsets drin,
dann ist das eindeutig falsch. Die pragmatische Loesung besteht
darin, ein solches Verhalten zu verhindern.

Im Gegensatz dazu sind die Wahlmoeglichkeiten objektorientiert
vs. prozedural zu programmieren grundsaetzlich beide "richtig".
Hier besteht die pragmatische Loesung deshalb darin, beide
Mogelichkeiten zuzulassen.


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/