From 497b9801238cc3aef87293b09f1cecf68ecdbcfa Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 26 Nov 2018 15:20:47 +0100 Subject: [PATCH] LC_CTYPE-Locale auf eine UTF-8-Locale setzen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. --- SL/Dispatcher.pm | 6 ++++++ scripts/task_server.pl | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/SL/Dispatcher.pm b/SL/Dispatcher.pm index 6b7cf6300..abc5ec82f 100644 --- a/SL/Dispatcher.pm +++ b/SL/Dispatcher.pm @@ -18,6 +18,7 @@ use File::Basename; use IO::File; use List::MoreUtils qw(all); use List::Util qw(first); +use POSIX qw(setlocale); use SL::ArchiveZipFixes; use SL::Auth; use SL::Dispatcher::AuthHandler; @@ -51,6 +52,11 @@ sub new { SL::ArchiveZipFixes->apply_fixes; + # Initialize character type locale to be UTF-8 instead of C: + foreach my $locale (qw(de_DE.UTF-8 en_US.UTF-8)) { + last if setlocale('LC_CTYPE', $locale); + } + return $self; } diff --git a/scripts/task_server.pl b/scripts/task_server.pl index 07cc53e89..fcdef4929 100755 --- a/scripts/task_server.pl +++ b/scripts/task_server.pl @@ -21,7 +21,7 @@ use English qw(-no_match_vars); use File::Spec; use List::MoreUtils qw(any); use List::Util qw(first); -use POSIX qw(setuid setgid); +use POSIX qw(setlocale setuid setgid); use SL::Auth; use SL::DBUpgrade2; use SL::DB::AuthClient; @@ -186,6 +186,11 @@ sub notify_on_failure { sub gd_preconfig { my $self = shift; + # Initialize character type locale to be UTF-8 instead of C: + foreach my $locale (qw(de_DE.UTF-8 en_US.UTF-8)) { + last if setlocale('LC_CTYPE', $locale); + } + SL::LxOfficeConf->read($self->{configfile}); die "Missing section [task_server] in config file" unless $lx_office_conf{task_server}; -- 2.20.1