Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision f5bc2335

Von Moritz Bunkus vor etwa 14 Jahren hinzugefügt

  • ID f5bc233522743646b118d0756b0041b16418fbdf
  • Vorgänger 514439bd
  • Nachfolger 90edf0b1

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.

Unterschiede anzeigen:

SL/Locale.pm
462 462
  return $self->quote_special_chars($dst_format, $self->quote_special_chars("${src_format}-reverse", shift));
463 463
}
464 464

  
465
sub raw_io_active {
466
  my $self = shift;
467

  
468
  return !!$self->{raw_io_active};
469
}
470

  
465 471
sub with_raw_io {
466 472
  my $self = shift;
467 473
  my $fh   = shift;
468 474
  my $code = shift;
469 475

  
476
  $self->{raw_io_active} = 1;
470 477
  binmode $fh, ":raw";
471 478
  $code->();
472 479
  binmode $fh, ":utf8" if $self->is_utf8;
480
  $self->{raw_io_active} = 0;
473 481
}
474 482

  
475 483
1;

Auch abrufbar als: Unified diff