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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gast

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

Beitragvon Gast » Donnerstag 4. November 2004, 13:46

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 4. November 2004, 14:20

Hi Gast.

änder mal die Zeile 51 in:

Code: Alles auswählen

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



Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Donnerstag 4. November 2004, 14:44

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 ...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 4. November 2004, 15:46

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Donnerstag 4. November 2004, 22:28

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!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 4. November 2004, 22:37

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Freitag 5. November 2004, 10:36

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!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 5. November 2004, 16:23

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?
Gast

Beitragvon Gast » Sonntag 7. November 2004, 17:35

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Sonntag 7. November 2004, 17:48

Hi!

Hast Du auch

Code: Alles auswählen

from codecs import open

geschrieben, so wie's Dookie gezeigt hat?

Gruß, mawe
Gast

Beitragvon Gast » Sonntag 7. November 2004, 17:59

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)
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 7. November 2004, 19:01

'\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

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Sonntag 7. November 2004, 19:24

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?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 7. November 2004, 19:53

such nach 'f6' das is bei latin-1 ein ö was in unicode als c3b6 dargestellt wird.

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Sonntag 7. November 2004, 20:13

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?

Wer ist online?

Mitglieder in diesem Forum: __deets__