jinja utf-8 umlaut problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
subzee
User
Beiträge: 8
Registriert: Freitag 17. November 2006, 00:20

jinja utf-8 umlaut problem

Beitragvon subzee » Freitag 15. Dezember 2006, 19:14

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=]
<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>
[/code]

ich hab es getestet auf:
py version 2.4
conf.d/charset:AddDefaultCharset UTF-8
debian/apache2 mit mod_python
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Freitag 15. Dezember 2006, 20:53

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...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 15. Dezember 2006, 20:53

Jinja arbeitet sehr gut mit Unicode-Strings. Wenn du "para1" als Unicode-String übergibst, sollte kein Problem auftreten.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 15. Dezember 2006, 20:54

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
subzee
User
Beiträge: 8
Registriert: Freitag 17. November 2006, 00:20

Beitragvon subzee » Freitag 15. Dezember 2006, 21:52

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.
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Freitag 15. Dezember 2006, 21:59

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'
>>>
subzee
User
Beiträge: 8
Registriert: Freitag 17. November 2006, 00:20

Beitragvon subzee » Freitag 15. Dezember 2006, 22:25

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)
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Samstag 16. Dezember 2006, 01:04

Ohne Traceback sieht man nicht wo das passiert. Kannst du mal den kompletten Traceback posten?
TUFKAB – the user formerly known as blackbird
subzee
User
Beiträge: 8
Registriert: Freitag 17. November 2006, 00:20

Beitragvon subzee » Samstag 16. Dezember 2006, 15:25

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
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Samstag 16. Dezember 2006, 19:25

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')
TUFKAB – the user formerly known as blackbird
subzee
User
Beiträge: 8
Registriert: Freitag 17. November 2006, 00:20

Beitragvon subzee » Samstag 16. Dezember 2006, 23:52

großartig es funktioniert :)

vielen dank!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder