Seite 1 von 1

jinja utf-8 umlaut problem

Verfasst: Freitag 15. Dezember 2006, 19:14
von subzee
Ich habe versucht Jinja (template engine) zu benutzen. Leider komme ich mit den Umlauten nicht zu recht.

Wenn ich einen request sende über GET/POST und den Inhalt ausgebe und dieser ein nonascii Zeichen besitzt (öüß..) stirbt das Script mit dieser Fehlermeldung.
[Fri Dec 15 19:04:17 2006] [error] [client 127.0.0.1] PythonHandler mod_python.publisher: UnicodeEncodeError: 'ascii' codec can't encode character u'\\xf6' in position 130: ordinal not in range(128), referer: http://localhost/python/bla/?para1=sadsds
Die Tips im Forum und im Wiki habe ich beachtet aber ich komme auf keine Lösung.
Vielleicht sieht jemand mehr :)

python:

Code: Alles auswählen

# -*- coding: utf-8 -*-
from jinja import Template, Context, FileSystemLoader

def bla(para1):
    t = Template('bla', FileSystemLoader('/var/www/templates/'))
    c = Context({
            'para1' :   para1
            }
        )
    return t.render(c)
template:

Code: Alles auswählen

<html>
<head>
    <title>test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

{{ para1 }}

<form>
    <input type="text" name="para1">
    <input type="submit">
</form>
</body>
</html>
ich hab es getestet auf:
py version 2.4
conf.d/charset:AddDefaultCharset UTF-8
debian/apache2 mit mod_python

Verfasst: Freitag 15. Dezember 2006, 20:53
von rafael
Hi,
schreib mal unten

Code: Alles auswählen

print "Content-Type: text/html\n"
print t.render(c)
Bei mir läuft das so einwandfrei...

Verfasst: Freitag 15. Dezember 2006, 20:53
von birkenfeld
Jinja arbeitet sehr gut mit Unicode-Strings. Wenn du "para1" als Unicode-String übergibst, sollte kein Problem auftreten.

Verfasst: Freitag 15. Dezember 2006, 20:54
von birkenfeld
rafael hat geschrieben: Bei mir läuft das so einwandfrei...
Ja, weil du auf die Konsole ausgibst, die beliebige ASCII-Strings akzeptiert. mod_python tut das nicht.

Verfasst: Freitag 15. Dezember 2006, 21:52
von subzee
danke euch zwei.

auf der konsole hab ich auch keine probleme es auszugeben.

hab es nochmal probiert den string zu einem unicode string umzuwandeln:

Code: Alles auswählen

def bla(para1):
    t = Template('j', FileSystemLoader('/var/www/templates/'))

    #para1 = unicode(para1, 'ascii')
    #para1 = u.encode('utf8')
    para1 = unicode(para1)

    c = Context({
            'para1' :   para1
            }
        )

    return t.render(c)

fehlermeldung:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Bin ich da der erste der mit sowas kämpft? :)
das ganze soll eine simple suchabfrage werden in einer sqlite datenbank und da könnten schon mal umlaute vorkommen.

steh im wald sorry.

Verfasst: Freitag 15. Dezember 2006, 21:59
von rafael
Du musst ja auch noch ein Encoding angeben...

Code: Alles auswählen

>>> a = "aö"
>>> unicode(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
>>> unicode(a, "utf-8")
u'a\xf6'
>>> 

Verfasst: Freitag 15. Dezember 2006, 22:25
von subzee
leider selber Fehler:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 126-129: ordinal not in range(128)

Code: Alles auswählen

def bla(para1):
    t = Template('j', FileSystemLoader('/var/www/templates/'))

    para1 = unicode(para1, "utf-8")

    c = Context({
            'para1' :   para1
            }
        )

    return t.render(c)

Verfasst: Samstag 16. Dezember 2006, 01:04
von mitsuhiko
Ohne Traceback sieht man nicht wo das passiert. Kannst du mal den kompletten Traceback posten?

Verfasst: Samstag 16. Dezember 2006, 15:25
von subzee
hier der traceback:
das ganze tritt auf wenn ich über die form einen umlaut schicke.
mit normalen (ascii) zeichen geht es.
Mod_python error: "PythonHandler mod_python.publisher"

Traceback (most recent call last):

File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 299, in HandlerDispatch
result = object(req)

File "/usr/lib/python2.4/site-packages/mod_python/publisher.py", line 143, in handler
result = str(result)

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 126: ordinal not in range(128)
danke

Verfasst: Samstag 16. Dezember 2006, 19:25
von mitsuhiko
Das hat mit jinja nix zu tun. mod_python kann nicht mit unicode. Also musst du so machen:

Code: Alles auswählen

t.render(c).encode('utf-8')

Verfasst: Samstag 16. Dezember 2006, 23:52
von subzee
großartig es funktioniert :)

vielen dank!