From 497b9801238cc3aef87293b09f1cecf68ecdbcfa Mon Sep 17 00:00:00 2001
From: Moritz Bunkus <m.bunkus@linet-services.de>
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