Seite 1 von 1

UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 17:56
von script_composer
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

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:02
von cofi
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?

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:08
von script_composer
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

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:12
von 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.

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:19
von script_composer
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?

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:25
von cofi

Code: Alles auswählen

with codecs.open(rootfolder + 'sites/sites.conf', encoding='utf-8'):
    ...
Und du solltest deine Dateien schliessen (oder eben `with` benutzen).

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:40
von script_composer
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

Re: UnicodeDecodeError

Verfasst: Dienstag 31. Mai 2011, 18:46
von cofi
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