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

Martin Vogel ⌂ @, Dortmund / Bochum, Mittwoch, 14. Februar 2018, 15:54 (vor 128 Tagen)

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 Konfigurationsbesonderheit, 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.

  1. 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.

  1. def print(*args, **kwargs):
  2. print_(*(str(arg).encode("ascii", "xmlcharrefreplace").decode()
  3. 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.

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

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

RSS-Feed dieser Diskussion
powered by my little forum