Ich denke, es ist sicher zu sagen, dass C-Locales allgemein als eine schlechte Idee anerkannt werden.Warum ruft QCoreApplication `setlocale (LC_ALL," ")` standardmäßig unter Unix/Linux auf?
Das Schreiben einer Anwendung, die versucht, textbasierte Maschinenformate zu parsen oder zu schreiben (was ziemlich oft vorkommt) mit C-Standardbibliotheksfunktionen wird nahezu unmöglich, wenn Sie berücksichtigen müssen, dass das Gebietsschema anders als "C"
ist. Da das Gebietsschema normalerweise pro Prozess ist (und setlocale
oft nicht threadsicher ist), wenn Sie eine Bibliothek schreiben oder ein Multithread-Programm haben, ist es nicht einmal sicher, setlocale(LC_ALL, "C")
zu tun und es wiederherzustellen, nachdem Sie Ihre Sachen gemacht haben.
Aus diesen Gründen lautet die Regel normalerweise "vermeiden setlocale
, Punkt"; aber: wir wurden in der Vergangenheit mehrmals durch das eigenartige Verhalten von QCoreApplication
und abgeleiteten Klassen gebissen; die documentation sagt:
Auf Unix/Linux Qt ist konfiguriert, um die Systemgebietsschemaeinstellungen standardmäßig zu verwenden. Dies kann zu einem Konflikt bei der Verwendung von POSIX-Funktionen führen, beispielsweise beim Konvertieren zwischen Datentypen wie Fließkommazahlen und Zeichenfolgen, da die Schreibweise von Gebietsschemata abweichen kann. Um dieses Problem zu umgehen, rufen Sie die POSIX-Funktion
setlocale(LC_NUMERIC,"C")
gleich nach der InitialisierungQApplication
oderQCoreApplication
, um das Gebietsschema, das für die Zahlenformatierung verwendet wird, auf "C" -Locale zurückgesetzt.
Dieses Verhalten wurde in another question beschrieben; Meine Frage ist: Was könnte der Grund für dieses scheinbar törichte Verhalten sein? Vor allem, was an Unix und Linux so besonders ist, hat eine solche Entscheidung nur auf diesen Plattformen ausgelöst?
(Übrigens wird alles brechen, wenn ich setlocale(LC_ALL, "C");
kurz nach dem QApplication
zu schaffen? Wenn es in Ordnung ist, warum sie nicht entfernen nur ihre setlocale(LC_ALL, "");
?)
Auf Linux-Wide-Char-Funktionen (z. B. wcstok) hat einen zusätzlichen Parameter, um es multithread sicher zu machen. QT sicherlich verwenden Standard-libc wide char-Funktionen auf Linux ... –