Revision f5bc2335
Von Moritz Bunkus vor etwa 14 Jahren hinzugefügt
dispatcher.fpl | ||
---|---|---|
4 | 4 |
|
5 | 5 |
use FCGI; |
6 | 6 |
use SL::Dispatcher; |
7 |
use SL::FCGIFixes; |
|
8 |
|
|
9 |
SL::FCGIFixes::apply_fixes(); |
|
7 | 10 |
|
8 | 11 |
SL::Dispatcher::pre_startup(); |
9 | 12 |
my $request = FCGI::Request(); |
Auch abrufbar als: Unified diff
Ausgaben mit FCGI richtig codieren
Hintergrund:
FCGI benutzt Perls I/O-Schitensystem nicht. Deshalb kümmert es sich
auch nicht um mit 'binmode STDOUT, ":utf8"' gesetzte
Konvertierungsparameter. Weiterhin enthält FCGI ab Version 0.69 Fixes,
die doppeltes Encoding bei der Ausgabe vermeiden und damit eigentlich
korrektes Verhalten herstellen.
Leider geht damit Lx-Offices Art, wie Strings intern gehandhabt und
ausgegeben werden, in die Hose. Lx-Office speichert Strings in Perls
internem Encoding und verlässt sich auf die mit "binmode" aktivierte,
autoatmische Konvertierung bei der Ausgabe.
Dieser Workaround implementiert das Umcodieren vom internen Encoding
nach UTF-8 mittels Monkeypatching, bevor die FCGIs originale
PRINT-Routine aufgerufen wird.
Das darf allerdings nicht passieren, wenn unbearbeitete Ausgabe
benötigt wird -- z.B. beim Download von
Binärdaten (PDFs). Glücklicherweise ist dies in der Funktion
"with_raw_io" in Locale gekapselt, sodass dieser Workaround den Status
"unbearbeitete Ausgabe?" bei Locale erfragen kann.