Umlaute und \n problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Samstag 26. Juli 2008, 23:38

Hallo,
und wieder hab ich ein Problem :oops:
Ich habe eine html-Datei mit einem Formular das die Daten von 2 Eingabefeldern per "POST" in UTF-8 an mein cgi-script schickt. Das script soll diese Daten verarbeiten und dann wieder in einer anderen html-datei ausgeben, die auch in UTF-8 sein soll. Das Funktioniert auch. Trotzdem werden in der html-datei Umlaute wie z.b. aus einem "ü" noch ein "\xc3\xbc" usw. eben.
Hier mal das script:

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*- 
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()
print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
#if autorname or autortext == None:
#    print """alert("Bitte füllen sie alle Felder aus")"""
#else:
#    pass
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
#html_utf = html_str.decode("utf8")
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """
<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
""", autorname,"""
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
""", Datum_str,"""
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
""", autortext,"""
</td>
</tr>
<tr height="25px">
</tr>"""
comment_string = str(comment)
soup.x.replaceWith(comment_string)
soup_string = str(soup)
soup_utf = soup_string.decode("utf8")
html_str.strip()
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(soup_utf.encode("utf-8"))
html_save.flush()
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
Ausserdem sind in der fertigen html-datei noch viele ""('\n('\n('\n \n"" zu finden. Ich weiß zwar das es zum Großteil "Linefeed" zeichen sind doch ich weiß nicht wieso da soviele sind und weshalb die angezeigt werden.


PS:Hoffe ihr verübelt mir nicht die vielen "extrem"-Anfänger-Fragen, aber ich bin nunmal einer :wink:
mfg. Martu
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 26. Juli 2008, 23:56

Weil du versuchst Tupeln zu Strings zu konvertieren, dabei zeigen eben Tupeln enthaltene Strings mit Spezialzeichen an:

Code: Alles auswählen

>>> ('äöä', 'üöäß')
('\xc3\xa4\xc3\xb6\xc3\xa4', '\xc3\xbc\xc3\xb6\xc3\xa4\xc3\x9f')
Tipp: nutze stattdessen eine Template-Engine. Das ist so oder so ein guter Tipp und sowohl Mako als auch Jinja sind ziemlich einfach zu benutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Sonntag 27. Juli 2008, 21:51

hmm, eigentlich habe ich nur vor die Daten die ich von einem html-formular bekomme in eine andere html-datei an einer bestimmten Stelle zu schreiben. Hatte gehofft sowas würde noch ohne eine template-engine gehen :o .
Habe mir aber trotzdem mal jinja runtergeladen und notdürftig installiert [ easy_install hat imme ne fehlermeldung gebracht :? ] aber ich kann es importieren usw. :)
Doch egal wie ich versuche das template zu laden, wenn ich es in der Idle zum testen laufen lass gehts ohne Fehler durch, doch wenn ich es dann mit dann von der webseite aufrufen lasse kommt immer ein "" 'ascii' codec can't decode byte 0xc3 in position 258: ordinal not in range(128) "" und das auch wenn ich das Formular komplett leer abgeschickt habe :? Was macht Idle da anders als der server?
mfg. Martu
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Mittwoch 30. Juli 2008, 00:43

Habs endlich hingekriegt das es so funktioniert wie ichs mir vorstelle :D (allerdings ohne jinja)
Das Ergebnis ist zwar bei weitem nicht perfekt (Umlaute, Sonderzeichen, und noch ein paar andere Zeichen...) aber denke mal das ich zumindest die meist benutzen zeichen wie die Umlaute noch hinkriegen werde.
Und da dies mein erstes cgi-Programm bzw. mein überhaupt erstes Programm ist wollte ich den vorerst fertigen code mal zum öffentlichen zerreißen freigeben :wink:

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")

#if autorname or autortext is None:
#    print """alert("Bitte füllen sie alle Felder aus")"""
#    print """<meta http-equiv="refresh" content"0; URL=../beitrag_verfassen.html">"""
#else:
#    pass
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """
<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
""", autorname,"""
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
""", Datum_str,"""
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
""", autortext,"""
</td>
</tr>
<tr height="25px">
</tr>"""
comment_str = str(comment)
soup.x.replaceWith(comment_str)
soup_str = str(soup)
soup_tup = soup_str.partition("content_anfang")
(kopf, trenner, content) = soup_tup
content_rep = content.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
content_esc = content_rep.decode("unicode-escape")
#soup_rep = soup_str.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
#soup_esc = soup_rep.decode("unicode-escape")
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(kopf)
html_save.write(trenner)
html_save.write(content_esc.encode("UTF-8"))
html_save.flush()
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
mfg. Martu
BlackJack

Mittwoch 30. Juli 2008, 15:40

Du solltest Dir vielleicht nochmal den Unterschied zwischen einer Datenstruktur wie einem Tupel, das ist `comment` nämlich, und deren Darstellung als Zeichenkette und einer Zeichenkette klar machen. Bau Dir eine Zeichenkette mit dem gewünschten Inhalt und nimm nicht die Zeichenkettendarstellung eines Tupels um daraus dann das "Unerwünschte" zu entfernen.
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Mittwoch 30. Juli 2008, 21:58

ok ich habe mal versucht das tupel zu vermeiden.
doch dabei gleich kam gleich der nächste fehler :? der für mich zumindest nicht nachvollziehbar ist.
Wenn ich versuche das Programm um es zu testen in der Idle ausführe dann kriege ich ständig nen ""Invaild Syntax" error und es wird in dem code

Code: Alles auswählen

# html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
Das "gaest" rot angestrichen, das in nem Kommentar liegt. Dachte in einem Kommentar kann man sogut wie alles schreiben (und der Dateiname ist auch richtig geschrieben)
Und wenn ich das über "cmd" ausführe wird mir bei dem ""comment"" ganz zum schluss wo ""autorname, Datum_str, autortext"" steht vom autorname das ""e"" angezeigt.

und wo ich grade dabei bin :)
Ist mein Ansatz so richtig oder habe ich da was Falsch verstanden?

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>""" autorname, Datum_str, autortext
print comment
comment
print type(comment)
#comment_str = str(comment)
soup.x.replaceWith(comment)
soup_str = str(soup)
soup_tup = soup_str.partition("content_anfang")
(kopf, trenner, content) = soup_tup
content_rep = content.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
content_esc = content_rep.decode("unicode-escape")
# soup_rep = soup_str.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
# soup_esc = soup_rep.decode("unicode-escape")
# html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
# html_save.write(kopf)
# html_save.write(trenner)
# html_save.write(content_esc.encode("UTF-8"))
# html_save.flush()
# html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
mfg. Martu
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. Juli 2008, 22:17

Du hast immer noch ein Tupel, genauso wie vorher.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Freitag 1. August 2008, 19:53

So nächster anlauf :wink:
erstmal der code ( hoffe jetzt ist nirgends mehr ein tupel drin ) und dann meine probleme damit :(

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
#autorname = form.getvalue("name", "")
#autortext = form.getvalue("text", "")
autorname = "testname"
autortext = "testtext"
autortext.replace("\r\n", "<br>").replace("\n", "<br>").replace("\r", "<br>")
html_dat = open("c:/html_seite/vers_3/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>

<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>

""" %autorname, Datum_str, autortext
print comment
comment
print type(comment)
soup.x.replaceWith(comment)
soup_str = str(soup)
html_save = open("c:/html_seite/vers_3/gaestebuch.html", "w")
html_save.write(soup_str)
html_save.flush
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
wenn ich versuche den code auszuführen gibt er mir diese Fehlermeldung :

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\html_seite\vers_3\cgi-bin\gaestebuch_vers3.py", line 40, in <module>
    """ %autorname, Datum_str, autortext
ValueError: unsupported format character '"' (0x22) at index 47
und ich weiß nicht wieso meine string formatierung da nicht funtioniert... an den 3 " " " hängts glaub ich nicht da ein test mit einem kleiner bsp string und 3 von den " " " problemlos funktioniert...

Das zweite Problem das ich momentan mit dem code habe ist das am anfang das "" autortext.replace("\r\n", ... "" nichts bringt. (auch nicht wenn ich die zeichen selbst in den string schreibe )
mfg. Martu
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 1. August 2008, 19:59

Das Problem ist, dass du nach dem % die Argumente in Klammern setzen musst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Freitag 1. August 2008, 20:17

Hab ich versucht aber auch dann gibt er mir genau die gleiche fehlermeldung.
mfg. Martu
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 1. August 2008, 20:33

Ja, weil noch Prozentzeichen im im Zielstringenthalten sind, die nicht zur Formatierung dienen. Verdopple diese einfach vorher mit "...".replace("%", "%%"), dann sollte es gehen.
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Freitag 1. August 2008, 21:11

Danke EyDu jetzt gehts :D immer diese kleinigkeiten die man zu leicht übersieht :roll:
mfg. Martu
Martu
User
Beiträge: 15
Registriert: Montag 21. Juli 2008, 00:02
Wohnort: nähe Darmstadt
Kontaktdaten:

Sonntag 3. August 2008, 20:48

So denke bald hab ichs :wink:
alles funktioniert soweit, sogar umlaute und Sonderzeichen(zumindest auch meinen PC mit firefox und IE woanders konnt ich nmoch nicht testen)

aktueller code :)

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print

form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
autorname_uni = autorname.decode("utf-8")
autortext_uni = autortext.decode("utf8")
autortext_uni = autortext_uni.replace("\r\n", "<br>").replace("\n", "<br>").replace("\r", "<br>")
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>

<tr bgcolor="#484848">
<td align="left" widht="50%%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td align="left" colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>

""" % (autorname_uni, Datum_str, autortext_uni)
soup.x.replaceWith(comment)
soup_str = str(soup)
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(soup_str)
html_save.flush
html_save.close
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
Jetzt wollte ich versuchen mit dem code:

Code: Alles auswählen

if autorname_uni or autortext_uni is None:
    print """<meta http-equiv="refresh" content="0; URL=../beitrag_verfassen.html">"""
    raise SystemExit()
herauszufinden ob nicht in die Textfelder eingegeben wurde, und wenn ja dann sollte der Browser wieder auf die beitrag verfassen seite wechseln und das script sollte sich beenden. Doch stattdessen gabs dann eine zerhauene darstellung des gästebuchs und das script konnte vom Browser aus nicht mehr richtig aufgerufen werden (immer wieder automatisch auf die beitrag verfassen seite gesetzt worden)

Und kann mir einer sagen wieso der Firefox das script richtig ausführt und der IE einfach nur den quellcode anzeigt ohne es auszuführen?

Das sollten nun aber dann auch meine letzten probleme sein :roll:
mfg. Martu
Antworten