Bauforum-Logo

Forum Bauen und Umwelt

log in | registrieren

zurück zum Forum
  Mix-Ansicht

Python auf dem Webserver: Umlaute und Sonderzeichen trotz Shared Hosting (Webmaster)

verfasst von Martin Vogel Homepage E-Mail, Dortmund / Bochum, 14.02.2018, 15:54 Uhr

Python ist eine wundervolle Sprache, um Webauftritte mit selbstgeschriebenen Programmen aufzuwerten. Auch, wer keinen eigenen Webserver betreibt, sondern nur ein günstiges Shared-Hosting-Paket eines großen Anbieters wie Strato oder 1und1 nutzt, kann auf seiner Website Python-3-Programme laufen lassen. Die print-Ausgaben der Programme werden dann als HTML-Seiten dargestellt.
Leider hat zumindest die Python-Implementation unter dem Apache-Webserver des Hosting-Anbieters 1und1, bei dem auch das Bauforum liegt, eine sehr ärgerliche Konfiguration, die dazu führt, dass Python dort ausschließlich ASCII-Zeichen ausgeben darf. Sobald auch nur ein einziger Umlaut über den Webserver wandern soll, bricht Python die Ausgabe ab oder der Server verweigert die Arbeit sogar komplett mit einem Serverfehler 500.
Wer einen eigenen Webserver betreibt, könnte nun die Konfiguration richten und die Ausgabe von ASCII auf UTF-8 umstellen. Als Shared-Hosting-Kunde hat man diese Möglichkeit leider nicht. Hier rettet uns Pythons ungewöhnliche Flexibilität, die es uns sogar erlaubt, die print-Funktion so für unsere Zwecke umzuschreiben, dass sie keine Umlaute und Sonderzeichen mehr ausgibt, sondern stattdessen eine ASCII-kompatible Ersatzdarstellung verwendet, die sogenannte XML-Zeichenreferenz. Aus einem „ü“ wird dann beispielsweise die ASCII-Zeichenfolge „ü“ und aus dem Unendlich-Zeichen „∞” wird das unschädliche „∞“.
Zuerst bringen wir die Originalfunktion in Sicherheit.

print_ = print


Der Funktionsaufruf print_() ist nun identisch zum Original print().
Anschließend definieren wir die print-Funktion so um, dass alle übergebenen Argumente in Zeichenketten umgewandelt werden, die anstelle von Sonderzeichen nur die ASCII-kompatiblen XML-Zeichenreferenzen erhalten.

def print(*args,**kwargs):
    print_(*(str(arg).encode("ascii","xmlcharrefreplace").decode()
             for arg in args),**kwargs)


Fertig!
Ab sofort kann jedes Python-Programm ohne weitere Änderung des Codes beliebige Texte auf 1und1-Webservern ausgeben. Lediglich, wenn wir die print-Funktion auch noch dazu verwenden, Daten in Textdateien zu schreiben, sollten wir vielleicht überlegen, ob wir dort nicht besser die Standard-UTF-8-Kodierung anstelle der XML-Zeichenreferenzen verwenden.
[image]

--
Dipl.-Ing. Martin Vogel
Leiter des Bauforums

Heute schon programmiert? Einführung in Python 3 (PDF)

antworten
 



gesamter Thread:

zurück zum Forum
  Mix-Ansicht
Forum Bauen und Umwelt | Kontakt | Impressum
8463 Postings in 4064 Threads, 1096 registrierte User, 41 User online (0 reg., 41 Gäste)
powered by my little forum  RSS-Feed  ^
map | new