Ich befürchte irgendetwas mache ich immer noch falsch...
einfach um es endlich zu kapieren habe ich mir nun eine ganz einfach Templateseite erstellt die da folgendermaßen auschaut:
Code: Alles auswählen
#encoding UTF-8
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" >
<TITLE>unicodetest</TITLE>
</HEAD>
<BODY>
$unicodetest <br />
Eine einfache Seite um einige Tests mit Cheetah auszuprobieren
</BODY>
</HTML>
Die Datei ist auch mit Unicode Encoding abgespeichert (zumindest sagen das UltraEdit und Editra). Aufgerufen und an über Cherrypy übergeben wird das Template aus Python heraus folgendermaßen
Code: Alles auswählen
filename = os.path.join(APPDIR, TEMPLATESDIR, "site1.tmpl")
template = Template(file = filename)
template.unicodetest = u"äöü"
return unicode(template).encode("utf-8")
Genau so funktioniert es auch. Die unicode Zeichenkette ``template.unicodetest`` wird so in das Dokument geschrieben wie erwartet.
Gehe ich aber nun hin und füge noch einen Umlaut in die Templatedatei ein - bekomme ich im Browser einen 500 Internal Server Error von Cheetah angezeigt - Der dazugehörige Traceback:
Code: Alles auswählen
Traceback (most recent call last):
File "e:\programme\python2_5\lib\site-packages\CherryPy-3.1.1-py2.5-win32.egg\cherrypy\_cprequest.py", line 606, in respond
cherrypy.response.body = self.handler()
File "e:\programme\python2_5\lib\site-packages\CherryPy-3.1.1-py2.5-win32.egg\cherrypy\_cpdispatch.py", line 25, in __call__
return self.callable(*self.args, **self.kwargs)
File "E:\www\homepage\main.py", line 143, in site1
return unicode(template).encode("utf-8")
File "e:\programme\python2_5\lib\site-packages\cheetah-2.0.1-py2.5.egg\Cheetah\Template.py", line 982, in __str__
def __str__(self): return getattr(self, mainMethName)()
File "cheetah__www_homepage_templates_site1_tmpl_1234950942_47_88346.py", line 104, in respond
File "e:\programme\python2_5\lib\site-packages\cheetah-2.0.1-py2.5.egg\Cheetah\DummyTransaction.py", line 32, in getvalue
return ''.join(outputChunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 75: ordinal not in range(128)
wo ist denn hier mein Denkfehler? Für mich sieht das so aus als würde der feste Inhalt der Templatedatei nicht als Unicode eingelesen werden. Denn wenn ich das ganze ohne Unicode versuche ``template.unicodetest`` wird in einem normalen String geändert und der rückgabewert wird zu ``return str(template)`` bekomme ich die Seite wieder ohne Fehler ausgeliefert ... allerdings kann ich keine Unicodeobjekte mehr übergeben - die führen zu einem Fehler.
ich stehe mit encodings irgendwie auf Kriegsfuss - wäre nett wenn mir dabei auch noch geholfen werden könnte
Sebastian