UnicodeDecodeError

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
script_composer
User
Beiträge: 29
Registriert: Mittwoch 13. April 2011, 12:42

Merkwürdige Sache...

Habe eine einfache Seite in mit Bottle geschrieben. Auf meinem Rechner mit Python 2.7 klappt das wunderbar. Wenn ich das Paket jedoch auf den v-Server hoch lade, auf dem python 2.6 läuft bekomme ich folgende Fehlermeldung:
Error 500: Internal Server Error

Sorry, the requested URL 'http://www.atelier-langebeckmann.de/index.html' caused an error:

Internal Server Error
Exception:

UnicodeDecodeError('ascii', 'Gro\xc3\x9fe Bilder', 3, 4, 'ordinal not in range(128)')
Traceback:

Traceback (most recent call last):
File "/home/h-atelier/bottle.py", line 651, in _handle
return callback(**args)
File "/home/h-atelier/bottle.py", line 1145, in wrapper
rv = callback(*a, **ka)
File "hatelier.py", line 109, in main
menue += u'<p><a class="menue" href="%s">%s</a></p>' % (seite[0], seite[1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

Kann mir keinen Reim daraus machen. Jemand eine Idee?

MfG
Martin
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun, deine `seite[0]` und/oder `seite[1]` sind keine `unicode` Objekte sondern Strings. Und darum wird versucht sie mit ASCII in Unicode zu dekodieren, nur gibt es kein ß in ASCII.

Warum es unter Python2.7 funktionieren sollte ist mir schleierhaft. Sind die Daten denn ueberhaupt identisch?
Benutzeravatar
script_composer
User
Beiträge: 29
Registriert: Mittwoch 13. April 2011, 12:42

mhhh ok da ist in der Datei ein "ß", aber schon die Textdatei ist utf-8 kodiert.


Die Daten sind 1:1 kopiert.

Code: Alles auswählen

@route('/:site')
def main(site, content = ''):
    menue = u''
    sites = open(root_folder + 'sites/sites.conf', 'r')
    
    for seiten in sites:
        seite = seiten.strip().split(';')
        if site != seite[0]:
            menue += u'<p><a class="menue" href="%s">%s</a></p>' % (seite[0], seite[1])
        else:
            menue += u'<p><a class="menue_da" href="%s">%s</a></p>' % (seite[0], seite[1])
    
    if content == '':
        site_file = open(root_folder + 'sites/' + site, 'r')
        content = site_file.read()
    
    return template('main-template', content = content, menue = menue)
Hier mal den Codeausschnitt zum Nachvollziehen
BlackJack

@script_composer: Wie die Daten kodiert sind weiss Python ja nicht. Das nimmt in solchen Situationen immer ASCII an und wenn da etwas ausserhalb von ASCII in den Bytewerten ist, dann gibt es diese Ausnahme. Und das ist bei Python 2.6 und 2.7 gleich.
Benutzeravatar
script_composer
User
Beiträge: 29
Registriert: Mittwoch 13. April 2011, 12:42

Wenn das bei beiden gleich ist, woher kommt denn dann dieses Problem? Kann ich python denn klar machen, dass es sich bei der Textdatei um unicode handelt?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

with codecs.open(rootfolder + 'sites/sites.conf', encoding='utf-8'):
    ...
Und du solltest deine Dateien schliessen (oder eben `with` benutzen).
Benutzeravatar
script_composer
User
Beiträge: 29
Registriert: Mittwoch 13. April 2011, 12:42

Ok irgendwie ist das ganz merkwürdig. Normalerweise schließt man Textdateien doch mit variable.close() oder?

Weil ich bekomme jetzt die Meldung beim starten:

Code: Alles auswählen

  File "hatelier.py", line 92
    bilder_conf.close()
    ^
IndentationError: unexpected indent
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

script_composer hat geschrieben:Ok irgendwie ist das ganz merkwürdig. Normalerweise schließt man Textdateien doch mit variable.close() oder?
Genauso wie Binaerdateien. Aber bei dir fehlt es mehrmals.
`with` führt eine Suite ein, genauso wie `for`, darum musst du es logischerweise einruecken.

http://docs.python.org/reference/compou ... -statement
Antworten