Revision 497b9801
Von Moritz Bunkus vor fast 6 Jahren hinzugefügt
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
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.