[Python-de] (Unicode)Wenn ich das richtig sehe...

Olaf 'Rübezahl' Radicke olaf_rad at gmx.de
Die Mai 25 05:38:40 CEST 2004


On Monday 24 May 2004 21:27, Diez B. Roggisch wrote:
> Am Montag, 24. Mai 2004 19:37 schrieb Olaf 'Rübezahl' Radicke:
> > On Sunday 23 May 2004 23:31,Martin v. Löwis  wrote:
> > > xml.parsers.expat kann Unicode.
> >
> > Ich bekomme eine Fehlermeldung das Zeichen XY(Umlaute) nicht korrekt
> > sind. Wenn ich die Ausnahme abfange, ist das Ergebnis korrekt. In
> > sofern stimmt es das xml.parsers.expat *quasi* Unicode kann.
>
> Nein - er kann. Siehe angehangenes Skript.
>
> Erfahrungsgemaess kommen die meisten Fehler im Umgang mit encodings aus dem
> Unverstaendnis der Programmierer 

</Polemik-Tag>
Das wird wohl so sein, AAAABER.... wenn man sich was unverständliches
aus denkt, muss man sich nicht wundern wenn es nicht verstanden wird.
</Polemik-Tag> 


#!/usr/bin/python
import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
    print 'Start element:', name, attrs
def end_element(name):
    print 'End element:', name
def char_data(data):
    print 'Character data in utf8:', data.encode("utf8")
    print 'Character data in latin1:', data.encode("latin1")

p = xml.parsers.expat.ParserCreate()


p.returns_unicode = True
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data


doc_l1 = unicode("""<?xml version="1.0" encoding="latin1"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">lauter Umlaute: üä  </child2>
</parent>""","latin1")

doc_u8 = """<?xml version="1.0" encoding="utf-8"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">lauter Umlaute: üä  </child2>
</parent>""".decode("latin1").encode('utf8')

doc_u = u"""<?xml version="1.0" encoding="utf-8"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">lauter Umlaute: üä  </child2>
</parent>"""


#print doc_l1
#print doc_u1

p.Parse(doc_l1.encode("latin1"))
p.Parse(doc_l1)
# Plums! Und fliegt auf die Fr****
# Das ist aber schade! Sicher, die im XML steht es soll
# Latin-1 sein, aber die Funktionen die das XML an den
# Parser (bei mir) weiterreichen, kennt die Codeirung nicht
# und können sie auch nicht "vorbereiten" für den Parser
# - bis her. Wenn es für das Modul unmöglich ist zu erkennen
# "ah, das ist Unicode, auch wenn in Header was anderes steht"
# Dann muss ich entweder die Schnittstellen weiter aufweichen
# und nicht-unicode zwischen den Objekt-Instanzen durchreichen
# oder noch mehr casten und strings analysieren.

p.Parse(doc_u8, 1)

# Klatsch! Wieder auf die Nase gefallen:
# xml.parsers.expat.ExpatError: junk after document element: line 4, column 9

p.Parse(doc_u, 1)

# Rums! Und noch mal...
# UnicodeError: ASCII encoding error: ordinal not in range(128)