Seite 1 von 1

Fehler mit Umlauten und dem Umlenkung in eine Datei (Linux)

Verfasst: Donnerstag 4. November 2004, 13:46
von Gast
Hallo zusammen,

ich habe bei einem Script ein Problem festgestellt: Wenn ich das Script starte, dann bekomme ich alle Ausgaben normal; auch Umalute werden korrekt in der Kosnole angezeigt. Wenn ich die Ausgabe nun in eine Datei umlenken will

Code: Alles auswählen

./script.py > datei.html
bekomme ich den Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "./docmaker.py", line 161, in ?
    d.printHTML()
  File "./docmaker.py", line 30, in printHTML
    i.printHTML()
  File "./docmaker.py", line 51, in printHTML
    print "<h1>%s</h1>" % self.titel
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 17: ordinal not in range(128)
Wieso?

Ich habe schon div. Suchen gestartet, aber keine Lösung gefunden.

Ich habe das Encoding per

Code: Alles auswählen

# -*- coding: utf-8 -*-
gesetzt. Außerdem kann er das Script ja abarbeiten, wenn er es nur auf dem Bildschirm ausgeben soll.

Ich hoffe, jemand hat eine Ahnung, woran es klemmt.

Verfasst: Donnerstag 4. November 2004, 14:20
von Dookie
Hi Gast.

änder mal die Zeile 51 in:

Code: Alles auswählen

print u"<h1>%s</h1>" % self.titel

Gruß

Dookie

Verfasst: Donnerstag 4. November 2004, 14:44
von Gast
Danke für den Tip, hatte ich bereits ausprobiert! Ändert leider überhaupt nichts ... die Fehlermeldung ist die gleiche.

Mittlerweile habe ich alle Umlaute und ß aus der xml-Quelldatei entfernt. Nun klappt es; aber das ist auf Dauer keine Lösung, ich will nicht immer "ue" statt "ü" schreiben müssen ...

Verfasst: Donnerstag 4. November 2004, 15:46
von Dookie
aha die strings stammen aus einer xml-datei. Konnte ich ja nicht wissen.

Code: Alles auswählen

from codecs import open
...
xml_datei = open("name.xml", "r", encoding="utf-8")
#datei auslesen
xml_datei.close()
Oder arbeitest Du mit einem Parser? Bei expat kannst Du eine Option einstellen, daß er immer "utf-8" zurückgibt bei Strings.


Gruß

Dookie

Verfasst: Donnerstag 4. November 2004, 22:28
von Gast
Sorry, ja, hätte ich erwähnen sollen ...
ich arbeite mit dem minidom Parser.

Da habe ich nichts dergleichen gefunden - wobei das Parsen und Ersetzen ja wunderbar funzt - nur wenn ich es in eine andere Datei umleite kommt der Fehler ... imho sehr mysteriöse!

Verfasst: Donnerstag 4. November 2004, 22:37
von Dookie
dann lenk halt nich in eine Datei um, sondern übergib die datei als Kommandozeilenargument an das script. Dann kannst Du die datei mit dem utf-8 encoding zum schreiben öffnen.


Gruß

Dookie

Verfasst: Freitag 5. November 2004, 10:36
von Gast
Tja, daran habe ich auch schon gedacht - werd ich wohl so umsetzen müssen. Eigentlich schade, denn so ist man flexibler, was das Pipen in andere Tools anbelangt. (Klar, kann man auch mit einer fertigen Datei so machen).

Außerdem würde ich dennoch gerne diesen verdammten Fehler finden. Nervt schon ein wenig ...

Trotzdem Danke für Deine Hilfe!

Verfasst: Freitag 5. November 2004, 16:23
von Milan
Hi. Warum kann man minodom nicht einfach auch eine mit utf-8 encoding geöffnete Datei übergeben? Dann müsstest du doch auch so nur Unicode geliefert bekommen, der auch wirklich als Unicode begriffen werden kann, oder seh ich da jetzt was falsch?

Verfasst: Sonntag 7. November 2004, 17:35
von Gast
Hallo nochmal,

das öffnen mit dem Parameter funzt net!
xml_datei = open("name.xml", "r", encoding="utf-8")
Ich bekomme dann folgende Fehlermeldung:
temp=open(file,"r",encoding="utf-8").read()
TypeError: 'encoding' is an invalid keyword argument for this function
Ich benutze Python 2.3.3

Verfasst: Sonntag 7. November 2004, 17:48
von mawe
Hi!

Hast Du auch

Code: Alles auswählen

from codecs import open
geschrieben, so wie's Dookie gezeigt hat?

Gruß, mawe

Verfasst: Sonntag 7. November 2004, 17:59
von Gast
Wer lesen kann ist klar im Vorteil ... hatte ich natürlich nicht gemacht.

OK, der Funktionsaufruf geht jetzt, aber das Problem ist gegeblieben:
Traceback (most recent call last):
File "./docmaker.py", line 348, in ?
d=Doc(file,out,format)
File "./docmaker.py", line 21, in __init__
top=xml.dom.minidom.parseString(temp)
File "/usr/lib/python2.3/xml/dom/minidom.py", line 1929, in parseString
return expatbuilder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 297: ordinal not in range(128)

Verfasst: Sonntag 7. November 2004, 19:01
von Dookie
'\xf6' ist eben kein Unicode. Da dürfte der Fehler in der XML-Datei liegen. Schau sie dir mal mit nem Hexeditor an, vim kann z.B. Dateien als Hexcodes darstellen.


Gruß

Dookie

Verfasst: Sonntag 7. November 2004, 19:24
von Gast
Ok, aber wieso / woher hat er das Zeichen denn dann? Ich öffne die Datei doch nun explizit als Unicode Datei. Der Parser dürfte doch dann keine nicht-Unidocde Zeichen mehr im String finden?

Ich kann mir das gerne mal in einem Hex-Editor ansehen, aber wonach genau soll ich gucken?

Verfasst: Sonntag 7. November 2004, 19:53
von Dookie
such nach 'f6' das is bei latin-1 ein ö was in unicode als c3b6 dargestellt wird.

Verfasst: Sonntag 7. November 2004, 20:13
von Gast
Das ist wirklich merkwürdig ... ich habe nur die beiden Bytes: c3 b6 anstelle des ü gefunden ... (bei anderen Umlauten sind es auch immer zwei)

Was hat das nun wieder zu bedeuten?

Verfasst: Sonntag 7. November 2004, 21:55
von Dookie
jo dann ists unicode mit den zwei Bytes. Womit wurde denn die xml-datei erstellt bzw. wo ist die her?

Verfasst: Montag 8. November 2004, 10:19
von Gast
Mit dem Texteditor Kate. Gespeichert als utf-8.

Nur, wieso bricht er mit einem Fehler ab?

Verfasst: Montag 8. November 2004, 14:07
von Dookie
Da musst die Pythonentwickler fragen, beim Umwandeln mit str.encode() bzw str.decode() kann man mit einem zusätzlichen Argument bestimmen, was bei unumwandelbaren Zeichen geschehen soll:

Code: Alles auswählen

>>> "\xf6".decode("latin-1").encode("ascii", "xmlcharrefreplace")
Out[15]: 'ö'
Standartmässig steht das auf "strict" und bedeutet, daß eben eine Exception geworfen wird.


Gruß

Dookie

Verfasst: Montag 8. November 2004, 23:23
von Gast
Hallo nochmal

folgender Thread hat mir geholfen:
http://python.sandtner.org/viewtopic.ph ... 47381b9db1

Ich habe nun folgende Zeile hinzugefügt:

Code: Alles auswählen

temp=open(file,"r",encoding="utf-8").read()
...
top=xml.dom.minidom.parseString(str(temp.encode("utf-8")))
[/quote]
Nun klappts auch :)

Danke noch einmal an alle!

Ciao,
Gast

PS: Ich sollte mich mal registrieren ...