Umlaute und Unicode-Zeichen in Python-CGI-Skripten (Software)

Martin Vogel ⌂ @, Dortmund / Bochum, Tue, 18.09.2018, 11:45 (vor 2018 Tagen)

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

  1. #!/usr/bin/env python3
  2.  
  3. # Biegt die Ausgabekodierung für den Betrieb auf 1&1-Webservern zurecht.
  4.  
  5. import sys
  6. import codecs
  7.  
  8. if "idlelib" in sys.modules:
  9. print("Modul 'einsundeins' wäre jetzt aktiv, wenn nicht IDLE liefe.")
  10. else:
  11. try:
  12. sys.stdin = codecs.getreader('utf8')(sys.stdin.buffer)
  13. sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
  14. except AttributeError:
  15. print("Content-Type: text/html;\n\n")
  16. 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

Tags:
Python, CGI, Unicode, Shared Hosting

RSS-Feed dieser Diskussion
powered by my little forum