ascii encoding error in der konsole

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.
Antworten
tkbah
User
Beiträge: 10
Registriert: Mittwoch 11. Juli 2012, 14:47

Hi Leute..

ich weis diese Thema wurde schon zigmal diskutiert und auch beschrieben.
Ich habe auch alles mögliche versucht was Ich hier finden konnte.
Es brachte mich nur kein Stück weiter..
Nun zu meinen Problem:
ich bekomme ein html File als String zurück.
welchen ich mit

Code: Alles auswählen

htmldoc = open("diagnose.html", "wb").write(result)
schreibe.
Das funktioniert in eclipse auch alles wunderbar.
Wenn ich das in der konsole aufrufe bekomme Ich ein:

Code: Alles auswählen

UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 3318: ordinal not in range(128)
zurück.
Ich habe es auch schon mit

Code: Alles auswählen

(u""+diagnose.html", "wb").write(result.decode('utf-8')
oder

Code: Alles auswählen

import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
brachte auch nicht denn gewünschten erfolg.
auch dieses flag

Code: Alles auswählen

# -*- coding: utf-8 -*-
ist gesetzt funktioniert aber nicht.
Ich habe auch schon denn codepage auf der Konsole mittels chcp geändert was aber auch nicht denn erfolg brachte.
Der folgende wiki eintrag hat mir auch nicht weitergeholfen.
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings


Hoffe ihr könnt mir weiterhelfen.
Um das python und encoding besser zu verstehen.
hier ein auszug aus dem code zum besseren verständnis:

Code: Alles auswählen

      while True:
            response = conn.getresponse();
            raw = response.read();
            ids = json.loads(raw)
            fetch = json.loads(ids["d"])
            status = fetch["status"]
            result = fetch["result"]
            print status
            time.sleep(5)
            if (status == "FINISHED"):
                htmldoc = open("diagnose.html", "wb").write(result)
                htmldoc.close()
                try: 
                    #os.startfile(r"diagnose-"+name+"+"+ dev +".html")
                    os.startfile(r"diagnose.html")
                    break
                    sys.exit()
                except:
                    print "ERROR: Could not open file"
                    sys.exit()
Greets TK
Zuletzt geändert von tkbah am Montag 27. August 2012, 13:55, insgesamt 1-mal geändert.
deets

Dieser Code ist so nicht lauffaehig - voellig unabhaengig von deinem unicode-problem:

http://docs.python.org/tutorial/inputou ... le-objects

"""
f.write(string) writes the contents of string to the file, returning None.
"""

mit anderen Worten: dein "htmldoc = ..." ist kaputt, weil du eben None an htmldoc bindest, worauf kein close aufgerufen werden kann.

Und darueber hinaus ist fuer dein Problem nicht das encoding-cookie des source-files anzupassen, noch irgendwas in der Shell, und auch kein filename-rumgefrickel.

Sondern die Daten, die du in "result" hast, sind ein unicode-String, und muessen vor dem schreiben in einen Byte-String umgewandelt werden. Welches encoding da das richtige ist, haengt von den Daten ab.
tkbah
User
Beiträge: 10
Registriert: Mittwoch 11. Juli 2012, 14:47

Hi,

also an meinen HTML doc liegt es nicht.
Hab mir mal denn print in der konsole ausgeben lassen konnte ihn auch einfach so in eine Datei kopieren und ihn auch mit meinen Webbrowser öffnen.
Wie kann ich python dazu bringen die ausgabe 1:1 über die konsole in das file zu schreiben?

Die result behinaltet ein paar div tags und plain text.
Sonst nichts habe es auch schon mit str() davor versucht brachte aber auch nix.

Greets TK
tkbah
User
Beiträge: 10
Registriert: Mittwoch 11. Juli 2012, 14:47

EDIT:

Hab es grad selber rausgefunden:
mit

Code: Alles auswählen

encoded_str = result.encode("windows-1252","ignore")
funktioniert es.

Greets TK
BlackJack

@tkbah: Auch wenn `htmldoc` nichts mit dem Kodierungsproblem zu tun hat, ist der Quelltext den Du gezeigt hast in der von deets beschriebenen Weise kaputt. Der Code führt unweigerlich zu einer ``AttributeError: 'NoneType' object has no attribute 'close'``-Ausnahme. Wenn Du die nicht siehst, dann ist das entweder nicht der Quelltext den Du auch tatsächlich ausführst, oder Du hast noch irgendwo so ein ``except`` ohne konkrete Ausnahme und „verschluckst” dort den Fehler. Die Fehlerbehandlung in dem gezeigten Quelltext ist auch schlecht, denn *jede* Ausnahme führt dort zu der Textausgabe, dass die Datei nicht geöffnet werden konnte. Auch wenn eine ganze andere Ausnahme in dem ``try``-Block ausgelöst wird.

Wenn Du in Python programmierst, solltest eventuell auch die Syntax von anderen Sprachen weglassen. Das Semikolon dient nicht zum Kennzeichnen vom Ende einer Anweisung sondern um mehere Anweisungen in einer Zeile zu trennen — was sinnlos ist, wenn die zweite Anweisung die leere Anweisung ist. Ausserdem sind um Bedingungen bei ``if`` und ``while`` keine Klammern nötig.

Für meinen Geschmack werden ein paar zu viele Zwischenergebnisse an (auch noch unpassende) Namen gebunden.
Antworten