(Unicode)Wenn ich das richtig sehe...
Hi! Ich bin wieder mal bei mein *lieblingsthema*: Es gibt ja einige die die Auffassung vertreten, das wenn man sein Pyhthon-Code richtig gestaltet, man nur wenige Schnittstellen hat wo Unicode gecastet werden muss und das meiste intern als reines Unicode behandelt werden kann - richtig? Vielleicht ist es Zufall, aber bei mir haben so viele Python-Module ohne Unicodefähigkeit, das das Prinzip kaum an zu wenden ist. Als da währe: Tkinter, xml.parsers.expat, pg, cmd, posix.system Ich will ja nicht prahlen, aber ich habe bald mehr Unicode-Coastings als if-Anweisung im Code. MfG Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Am Sonntag, 23. Mai 2004 12:08 schrieb Olaf 'Rübezahl' Radicke:
Vielleicht ist es Zufall, aber bei mir haben so viele Python-Module ohne Unicodefähigkeit, das das Prinzip kaum an zu wenden ist. Als da währe: Tkinter, xml.parsers.expat, pg, cmd, posix.system
Hmm... Wie lang wäre wohl die Liste der Module, die Unicode-Fähig sind? :) Ganz davon abgesehen: Tk kann kein Unicode, deswegen Tkinter auch nicht, expat kann kein Unicode (meiunes Wissens nach), deswegen xml.parsers.expat auch nicht, pg ist kein Python-Basis-Modul (und meines Wissens nach gibt es für Postgres mehr als ein DB-API Modul was auch Unicode kann, warum also bei pg bleiben?) und bei cmd und posix.system sind es die Beschränkungen des Basis-Systems, die die Unicode-Fähigkeit kaputtmachen. Unix kennt nun mal keine Unicode-Dateinamen (es kennt nur ein Filesystem-Encoding, welches aber nicht von Python, sondern beim mounten des Dateisystems gesetzt wird), im Gegensatz zu Windows, und unter Windows ist Unicode auch seit 2.3 komplett integriert in alle Funktionen die mit dem Dateisystem arbeiten (gibt sogar ein Flag in os.path welches Dir sagt, ob Unicode im Dateisystem unterstützt wird oder nicht). Vielleicht wäre es ganz ratsam, wenn Du Dich einfach mal darüber informieren würdest, ob die unterliegenden Bibliotheken Unicode können oder nicht, und dann entscheidest, wo der Fehler liegt, und ob Python nicht eigentlich das richtige macht, indem es einfach keine Unicode-Schnittstelle zur Verfügung stellt, sondern die Aufgabe dem Programmierer überlässt, der mit Sicherheit besser weiss, wie z.B. Unicode-Dateinamen auf Unix aussehen sollen... ;) Wegen xml.parsers.expat: Guck Dir mal die Python-Bindings von libxml (libxml ist ein Teil von Gnome), 4Suite (http://4suite.org) oder aber pyxml (http://pyxml.sourceforge.net) an, die können alle ohne Probleme mit XML in Unicode-Formatierung umgehen. Heiko. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
On Sun, 23 May 2004 14:08:48 +0200, Heiko Wundram <heikowu@ceosg.de> wrote:
Als da währe: Tkinter, xml.parsers.expat, pg, cmd, posix.system
Hmm... Wie lang wäre wohl die Liste der Module, die Unicode-Fähig sind? :) Ganz davon abgesehen: Tk kann kein Unicode, deswegen Tkinter auch nicht,
Tk bzw Tkinter unterstützen Unicode. Auf diese Seite ist ein Mini-Beispiel: http://www.jorendorff.com/articles/unicode/python.html Ich selber habe mit Tkinter auch schon meine Unicode-Erlebnisse gehabt. Und das ich kein grosser Freund der Unicode-Implementierung in Python bin, habe ich ja früher schon geschrieben... -- Mit freundlichen Grüßen Klaus Meyer :-) _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Heiko Wundram wrote:
Unix kennt nun mal keine Unicode-Dateinamen (es kennt nur ein Filesystem-Encoding, welches aber nicht von Python, sondern beim mounten des Dateisystems gesetzt wird)
Nein. Es gibt (zumindest bei den verbreiteten Unix-Dateisystemen) kein Filesystem-Encoding, das beim Mounten gesetzt werden könnte. Dateinamen sind einfach kodierungslose Byte-Folgen. Und das ist auch gut so.[tm] Das hat aber nichts mehr mit Python zu tun. Wer das ausdiskutieren will, bitte per Mail an mich. -- When replying to my email address, ensure that the mail header contains 'Felix Wiemann'. Please don't send unrequested mails > 64 KB. <http://www.ososo.de/> _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
On Monday 24 May 2004 19:43, Felix Wiemann wrote:
Heiko Wundram wrote:
Unix kennt nun mal keine Unicode-Dateinamen (es kennt nur ein Filesystem-Encoding, welches aber nicht von Python, sondern beim mounten des Dateisystems gesetzt wird)
Nein. Es gibt (zumindest bei den verbreiteten Unix-Dateisystemen) kein Filesystem-Encoding, das beim Mounten gesetzt werden könnte. Dateinamen sind einfach kodierungslose Byte-Folgen. Und das ist auch gut so.[tm]
Warum kann man das nicht bei Python auch so machen: Es gibt einfach nur kodierungslose Byte-Folgen. Dann ist man das Theater los, oder habe ich jetzt ein Denkfehler? Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
On Monday 24 May 2004 19:43, Felix Wiemann wrote:
Heiko Wundram wrote:
Unix kennt nun mal keine Unicode-Dateinamen (es kennt nur ein Filesystem-Encoding, welches aber nicht von Python, sondern beim mounten des Dateisystems gesetzt wird)
Nein. Es gibt (zumindest bei den verbreiteten Unix-Dateisystemen) kein Filesystem-Encoding, das beim Mounten gesetzt werden könnte. Dateinamen sind einfach kodierungslose Byte-Folgen. Und das ist auch gut so.[tm]
Warum kann man das nicht bei Python auch so machen: Es gibt einfach nur kodierungslose Byte-Folgen. Dann ist man das Theater los, oder habe ich jetzt ein Denkfehler?
Genau so ist es doch bei Python gemacht. Die kodierungslosen Byte-Folgen sind str, die kennen kein Encoding. Und unicode braucht kein Encoding, da unicode-Objekte nur Sequenzen von Unicode-Codepoints sind, das hat nix mit Encoding zu tun. Das Encoding kommt erst ins Spiel, wenn zwischen str und unicode konvertiert werden muß, was leider z.Z. auch noch bei vielen System-APIs passieren muß, wo Texte als Bytefolgen übergeben werden müssen. Bis demnächst, Walter Dörwald _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
Nein. Es gibt (zumindest bei den verbreiteten Unix-Dateisystemen) kein Filesystem-Encoding, das beim Mounten gesetzt werden könnte. Dateinamen sind einfach kodierungslose Byte-Folgen. Und das ist auch gut so.[tm]
Warum kann man das nicht bei Python auch so machen: Es gibt einfach nur kodierungslose Byte-Folgen. Dann ist man das Theater los, oder habe ich jetzt ein Denkfehler?
Kann man. Allerdings wollen die Leute unbedingt Buchstaben. Sie wollen Ah, Be, Ze, De, E, Ef, nicht 65, 66, 67, 68. Wenn der Programmierer Bytefolgen will, soll er <type 'str'> benutzen. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
Vielleicht ist es Zufall, aber bei mir haben so viele Python-Module ohne Unicodefähigkeit, das das Prinzip kaum an zu wenden ist. Als da währe: Tkinter, xml.parsers.expat, pg, cmd, posix.system
Tkinter kann Unicode, xml.parsers.expat kann Unicode. Ich weiß nicht, was pg ist. posix.system und cmd können wohl wirklich kein Unicode - das liegt daran, dass das Systemschnittstellen sind, und das Betriebssystem hier irgend ein Encoding vorschreibt. Leider dokumentiert das Betriebssystem nicht, um welches Encoding es sich dabei handelt - Bug im Betriebssystem. Kurz: an diesen Systemschnittstellen musst Du halt explizit konvertieren. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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. Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 - bloss weil man in den Header einer xml-datei "utf-8" reinschreibt ist noch lange keins drin. Ich becomme auf Arbeit auch gerne mal was das vermeintlich in latin1 ist, aber dann doch irgendeine schwurbelige windos-cp enthaelt. MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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) _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
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.
Ah sooooo. Du willst Unicode-Strings parsen, als ob sie XML wären. Auf die Idee muss man erstmal kommen... Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
On Tuesday 25 May 2004 21:54, Martin v. Löwis wrote:
Olaf 'Rübezahl' Radicke wrote:
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.
Ah sooooo. Du willst Unicode-Strings parsen, als ob sie XML wären. Auf die Idee muss man erstmal kommen...
...Hhhmmm? Wieso "als ob" ? Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Ah sooooo. Du willst Unicode-Strings parsen, als ob sie XML wären. Auf die Idee muss man erstmal kommen...
...Hhhmmm?
Wieso "als ob" ?
Ich denke mal martin will darauf hinaus das - unicode eine Definition von Zeichensaetzen mit meistens byte pro zeichen ist. - ein xml-parser keinen unicode, sondern einen bytestring gemaess einer im header spezifizierten codierung ist. Im Klartext heisst das: Wenn du den Text "üä" in unicode hast, sind das 4 byte - welche genau koennte man jetzt nachlesen. Du kannst die jetzt encodieren, und zwar wenigstens nach latin1 - da sind die Zeichen mit den wohlbekannten bytewerten \xfc\xe4 codiert - oder utf8, da ist es dann \xc3\xbc\xc3\xa4. Oder so: üä - das kennt man von Seiten in denen utf8 drin ist und latin1 drauf steht..... Merke: utf8 ist _nicht_ unicode, sondern eine Codierung, die viele Zeichen aus ascii direkt darstellt, und andere durch escapes wie oben - \xc3 ist ein escape Zeichen, und \xbc dann eben der code fuer ue. Deshalb macht dein letztes Beispiel keinen Sinn, und darauf wollte Martin denke ich mal hinaus... Es gibt wohl auch 2byte-codierungen, die denke ich mal mehr oder minder dasselbe byte-weise sind wie unicode - UTF-16 zB. UTF-32 hat dann immer 4 byte pro zeichen und garantiert das ein Zeichen somit immer gleich lang repraesentiert wird - etwas was in UTF-8 wie oben zu sehen ist nicht garantiert. Guter Link dazu: http://www.unicode.org/standard/principles.html Lichtet sich das Dunkel? Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
- unicode eine Definition von Zeichensaetzen mit meistens byte pro zeichen ist.
Da fehlt ne 2 zwischen meistens und byte... Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
Ah sooooo. Du willst Unicode-Strings parsen, als ob sie XML wären. Auf die Idee muss man erstmal kommen...
...Hhhmmm?
Wieso "als ob" ?
Nun ja. XML hat viele Repräsentation: Als DOM-Baum, als Infoset, als Folge von Bytes. Die Variante "Folge von Zeichen" kommt sehr selten praktisch vor, und provoziert damit Probleme. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
</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>
Die Thematik ist halt kompliziert und maessig gut verstanden - und das in jeder Sprache. Schau dir mal die Java-Apis an - da wurden in der Version 1.2 oder so dann auch mit einem mal an bestimmten Stellen Encoding-Angaben zur Pflicht, wenn man von bytes auf Strings oder zurueck wollte. Wir leben eben in einer komplexen Welt nach dem Turmbau zu Babel.....
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.
Das Modul _kann_ das nicht erkennen - woher denn auch? Das sind nur bytes - die koennten doch auch binaere floating point daten sein, who knows. Wenn du woher auch immer Daten bekommst, deren encoding du nicht kennst, kannst du nur heuristisch vorgehen - mal sehen, was klappt. Und wenn die Daten gemischt sind, dann ist Schei*e - aber weder python noch eine andere Sprache kann damit automatisch korrekt umgehen. Das ist immer die Schuld der Programmierer - wenn nicht deine, dann halt die der Leutz von denen du die Daten bekommst. Damit wir uns richtig verstehen: es geht mir oft genauso, und das auch gerne mal in java.
p.Parse(doc_u8, 1)
klappt bei mir.
p.Parse(doc_u, 1)
# Rums! Und noch mal... # UnicodeError: ASCII encoding error: ordinal not in range(128)
Ja - weil intern unicode durch einfaches verwenden halt zu ascii wird. mach mal str(doc_u), knallt auch. Du kannst doch die Deklaration deines xml-strings parsen - regex genuegt - und dann das verwendete encoding verwenden. Falls du bereits u"" hast direkt, sonst musst du eben decode/encode aufrufen. Im letzteren Falle kanns beim decode krachen - dann musst du das decode halt mit gaengigen codecs probieren, bis du das richtige gefunden hast. Und demjenigen auffe Finger kloppen, der dir den Schund liefert.... MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Olaf 'Rübezahl' Radicke wrote:
xml.parsers.expat kann Unicode.
Ich bekomme eine Fehlermeldung das Zeichen XY(Umlaute) nicht korrekt sind.
Dann ist vermutlich Dein Eingabedokument fehlerhaft, also kein korrektes XML.
Wenn ich die Ausnahme abfange, ist das Ergebnis korrekt. In sofern stimmt es das xml.parsers.expat *quasi* Unicode kann.
Nicht quasi, sondern vollständig, ohne wenn und aber. Wenn das Dokument richtiges XML ist, kann xml.parsers.expat es auch parsen. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (7)
-
"Martin v. Löwis"
-
Diez B. Roggisch
-
Felix Wiemann
-
Heiko Wundram
-
kgm
-
Olaf 'Rübezahl' Radicke
-
Walter Dörwald