Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 497b9801

Von Moritz Bunkus vor fast 6 Jahren hinzugefügt

  • ID 497b9801238cc3aef87293b09f1cecf68ecdbcfa
  • Vorgänger ab18d1c0
  • Nachfolger 780cb53f

LC_CTYPE-Locale auf eine UTF-8-Locale setzen

Beim Starten des Perl-Interpreters wird die Locale anhand von
Umgebungsvariablen wie `LC_CTYPE`, `LC_ALL` und `LANG`
gesetzt. Unter (F)CGI sind diese normalerweise leer, wodurch als
Locale die POSIX-Locale (`C`) gewählt wird — und die hat nur ASCII als
Zeichensatz.

Die iconv-Funktion scheint nun nicht transliterieren zu können, wenn
ASCII als Zeichensatz ausgewählt ist. Sie macht dann z.B. aus `ć` ein
`?` anstelle von `c`.

Beim Start der Programme wird nun `LC_CTYPE` auf eine sinnvoller
Locale gesetzt. Dies ist `de_DE.UTF-8` oder `en_US.UTF-8`, falls
erstere nicht verfügbar ist. Die Sprache ist hierbei irrelevant, da
nur `LC_CTYPE` gesetzt wird und und nicht z.B. auch `LC_MESSAGES` oder
`LC_TIME`.

Dies ist Voraussetzung dafür, das #348 gefixt werden kann.

Unterschiede anzeigen:

SL/Dispatcher.pm
18 18
use IO::File;
19 19
use List::MoreUtils qw(all);
20 20
use List::Util qw(first);
21
use POSIX qw(setlocale);
21 22
use SL::ArchiveZipFixes;
22 23
use SL::Auth;
23 24
use SL::Dispatcher::AuthHandler;
......
51 52

  
52 53
  SL::ArchiveZipFixes->apply_fixes;
53 54

  
55
  # Initialize character type locale to be UTF-8 instead of C:
56
  foreach my $locale (qw(de_DE.UTF-8 en_US.UTF-8)) {
57
    last if setlocale('LC_CTYPE', $locale);
58
  }
59

  
54 60
  return $self;
55 61
}
56 62

  
scripts/task_server.pl
21 21
use File::Spec;
22 22
use List::MoreUtils qw(any);
23 23
use List::Util qw(first);
24
use POSIX qw(setuid setgid);
24
use POSIX qw(setlocale setuid setgid);
25 25
use SL::Auth;
26 26
use SL::DBUpgrade2;
27 27
use SL::DB::AuthClient;
......
186 186
sub gd_preconfig {
187 187
  my $self = shift;
188 188

  
189
  # Initialize character type locale to be UTF-8 instead of C:
190
  foreach my $locale (qw(de_DE.UTF-8 en_US.UTF-8)) {
191
    last if setlocale('LC_CTYPE', $locale);
192
  }
193

  
189 194
  SL::LxOfficeConf->read($self->{configfile});
190 195

  
191 196
  die "Missing section [task_server] in config file" unless $lx_office_conf{task_server};

Auch abrufbar als: Unified diff