Umlaute und Unicode-Zeichen in Python-CGI-Skripten (Software)
Im Februar hatte ich hier einen Trick vorgestellt, mit dem Python-Programme, die als CGI-Skript auf Webservern laufen, dazu gebracht werden können, beliebige Unicode-Zeichen auszugeben. Realisiert wurde das durch eine Neudefinition der print-Funktion, die danach alle nicht-ASCII-Zeichen in ihre ASCII-kompatible XML-Ersatzdarstellung umwandelt. (Python auf dem Webserver: Umlaute und Sonderzeichen trotz Shared Hosting)
Es geht jedoch noch einfacher. Das Problem ist ja nicht, dass die Server der Shared-Hosting-Pakete nicht Unicode-tauglich wären, sondern dass Python das lediglich nicht zweifelsfrei herausfinden kann, weil beispielsweise bei 1und1 die entsprechende Umgebungsvariable nicht gesetzt wird.
Konfiguriert man in einem Python-Modul die Ein- und Ausgaberoutinen von Python so um, dass sie stets Unicode verwenden, so lassen sich CGI-Skripte ganz einfach dadurch sharedhostertauglich machen, dass man zu Beginn seines CGI-Skriptes dieses Modul importiert. Auf meinem Webauftritt habe ich die folgenden Zeilen als „einsundeins.py“ abgelegt und alle CGI-Skripte dort enthalten die Zeile „import einsundeins“.
#!/usr/bin/env python3 # Biegt die Ausgabekodierung für den Betrieb auf 1&1-Webservern zurecht. import sys import codecs if "idlelib" in sys.modules: print("Modul 'einsundeins' wäre jetzt aktiv, wenn nicht IDLE liefe.") else: try: sys.stdin = codecs.getreader('utf8')(sys.stdin.buffer) sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer) except AttributeError: print("Content-Type: text/html;\n\n") print("UTF-8-Umschaltung fehlgeschlagen!<br/>")
Für Testzwecke ist hier noch eine Fallunterscheidung eingebaut, die dafür sorgt, dass das Modul erkennt, ob gerade die Entwicklungsumgebung IDLE läuft, da diese ebenfalls die Ein- und Ausgaben umleitet. Wer das nicht benötigt, kann die drei Zeilen von „if“ bis „else:“ löschen und die Einrückung dahinter entfernen.
--
Dipl.-Ing. Martin Vogel
Leiter des Bauforums
Bücher:
CAD mit BricsCAD
Bauinformatik mit Python
gesamter Thread: