Seite 2 von 2

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 11:53
von BlackJack
@MarcelF6: Erkläre mal was in der Zeile in der `content` an einen Wert gebunden wird in jedem einzelnen Schritt passiert. Welchen Typ haben zum Beispiel die jeweiligen Zwischenergebnisse und was machen die einzelnen Aufrufe? Da sollte Dir dann etwas auffallen.

Des weiteren ist der Funktionsname, der Name des Arguments, und der Docstring falsch, weil keines davon tatsächlich die Bedeutung korrekt wiedergibt. Also `funktion()` streng genommen schon, aber das ist an der Stelle doch ein wenig *zu* generisch um nützlich zu sein.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 12:24
von MarcelF6
Jetzt habe ich es so:

Code: Alles auswählen

deffunktion(unicodeObjekt):
    '''Gib eine Datei auf der Standardausgabe aus.'''
    with open(unicodeObjekt, "r") as f:
	content = (f.read().decode('utf-8'))
	print content.replace(u'ä', u'ae')
(Um die Namen kümmere ich mich dann nachher ;) )
Also, bei der ersten Erwähnung von content wird der Dateiinhalt gelesen und nach UTF-8 dekodiert. [zum Testen habe ich in der Datei einige ä,ö,ü]
Das müsste eigentlich iO sein, denn mit print-Statements erhalte ich auch den korrekt-dargestellten Dateiinhalt.
Dann aber reklamiert meine shell schon wieder:
SyntaxError: Non-ASCII character '\xc3' in file 22.py on line 16, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Das merkwürdige ist: Auch wenn ich Kommentare mit ä,ö,ü mache, kommt nun diese Fehlermeldung. Wieso? Ich habe doch das UTF-8-Format - da sollte dies kein Problem sein...

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 12:31
von BlackJack
@MarcelF6: Es wird nicht *nach* UTF-8 dekodiert, sondern *von*.

Du hast Bytewerte ausserhalb von ASCII in Deiner Quelltextdatei, dann musst Du dem Compiler über den Kommentar mitteilen in welcher Kodierung die sind. Das hat nichts damit zu tun ob von dem Code in dem Skript Dateien geladen werden und in welcher Kodierung *die* vorliegen.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 13:16
von MarcelF6
Und das mache ich so, oder:
# -*- coding: utf-8 -*-#

Also Code gesamthaft:

Code: Alles auswählen

# -*- coding: utf-8 -*-#

import sys

def funktion(unicodeObjekt):
    '''Gib eine Datei auf der Standardausgabe aus.'''
    with open(unicodeObjekt, "r") as f:
	content = (f.read().decode('utf-8'))
	print content.replace(u'ä', u'ae')
	
if len(sys.argv) < 2:
    print 'Es wurden keine Parameter uebergeben.'
    sys.exit()
else:
    funktion(sys.argv[1])
Also eigentlich kann ich die Antwort so schon geben: Nein, so klappt es nicht. Obwohl ich gelesen habe, dass es so klappen müsste.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 13:41
von BlackJack
@MarcelF6: Da ist jetzt wieder die Frage was „klappt nicht” konkret bedeutet. Die Ausnahme das der Quelltext Zeichen ausserhalb ASCII enthält ohne das eine Kodierung angegeben ist, sollte zumindest nicht mehr kommen.

Was jetzt noch passieren kann, was ich aber auch schon erwähnt habe, ist das nicht erraten werden kann was der Prozess am anderen Ende der Standardausgabe für eine Kodierung erwartet. Dann wird dafür ASCII angenommen und das geht natürlich nicht wenn in dem `unicode`-Objekt, welches ausgegeben werden soll, etwas ausserhalb von ASCII enthalten sein sollte.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 13:53
von MarcelF6
Doch eben, es ist immernoch derselbe Fehler:
SyntaxError: Non-ASCII character '\xc3' in file 22.py on line 15, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
22.py heisst meine Datei. Und line 15 ist eben genau die mit dem replace-Statement.
Wenn ich die rausnehmen würde und unten beim print-Statement "übergeben" wirklich mit "ü" schreiben würde, kommt der Fehler dann einfach auf dieser Zeile. Und wenn ich gar keine Umlaute habe, klappt alles.
Aber eben...vom Code her müsste es ja eigentlich stimmen, daher frage ich mich wirklich, wo der Fehler liegt.
Ich habs auch mal bei eclipse probiert. Dort erscheint derselbe Fehler.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 14:01
von BlackJack
@MarcelF6: Das kann ich nicht nachvollziehen. Wenn ich Deinen Quelltext 1:1 per kopieren und einfügen in eine Datei übernehme, dann bekomme ich diese Ausnahme nicht.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 14:05
von lunar
@MarcelF6: Der beschriebene Fehler kann bei dem gezeigten Quelltext nicht auftreten, da die Deklaration der Kodierung vorhanden und korrekt ist. Bist Du sicher, dass Du auch wirklich diese Python-Datei ausführst, und nicht versehentlich eine ältere Version?

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 14:15
von /me
lunar hat geschrieben:@MarcelF6: Der beschriebene Fehler kann bei dem gezeigten Quelltext nicht auftreten, da die Deklaration der Kodierung vorhanden und korrekt ist.
Die Frage ist, ob der Python-Sourcecode jetzt auch wirklich in UTF-8 gespeichert wurde. Es reicht nicht, einfach nur das Encoding zu deklarieren.

Re: Umlaute

Verfasst: Sonntag 18. März 2012, 14:26
von MarcelF6
Merkwürdig.
Ja, hab zuerst auch gedacht, ob ich immernoch mit einer älteren Version arbeite. Aber es ist schon die aktuelle.
Und auch das gespeicherte Format ist korrekt.
Wie auch immer...ich werde den Code später an einem anderen Computer nochmals checken.
Danke vielmals für die Hilfe und die Geduld :)