Penso che sia sicuro dire che le localizzazioni C sono universalmente riconosciute come una cattiva idea.Perché QCoreApplication chiama `setlocale (LC_ALL," ")` di default su Unix/Linux?
Scrittura di un'applicazione che tenta di analizzare o scrivere formati di macchina basati su testo (cosa che accade abbastanza spesso) con le funzioni di libreria standard di C diventa quasi impossibile se si deve tenere conto dell'impostazione locale impostata su qualcosa di diverso da "C"
. Poiché la localizzazione è normalmente per processo (e setlocale
spesso non è thread-safe), se stai scrivendo una libreria o hai un programma multithreading non è sicuro nemmeno fare setlocale(LC_ALL, "C")
e ripristinarlo dopo aver fatto il tuo lavoro.
Ora, per questi motivi la regola è normalmente "evitare setlocale
, punto"; ma: siamo stati morsi diverse volte in passato dal comportamento particolare di QCoreApplication
e classi derivate; il documentation dice:
Su Unix/Linux Qt è configurato per utilizzare le impostazioni internazionali del sistema per impostazione predefinita. Ciò può causare un conflitto quando si utilizzano le funzioni POSIX, ad esempio, durante la conversione tra tipi di dati come float e stringhe, poiché la notazione potrebbe differire tra le impostazioni internazionali. Per ovviare a questo problema, chiamare la funzione POSIX
setlocale(LC_NUMERIC,"C")
subito dopo l'inizializzazione diQApplication
oQCoreApplication
per reimpostare le impostazioni locali utilizzate per la formattazione dei numeri su "C" -locale.
Questo comportamento è stato descritto in another question; la mia domanda è: quale potrebbe essere la logica di questo comportamento apparentemente sciocco? In particolare, cosa c'è di così peculiare su Unix e Linux che ha spinto tale decisione solo su queste piattaforme?
(Per inciso, sarà tutto rompersi se io faccio solo setlocale(LC_ALL, "C");
dopo aver creato il QApplication
? Se va bene, perché non hanno semplicemente rimuovere il loro setlocale(LC_ALL, "");
?)
Su linux wide char functions (es: wcstok) ha un parametro extra per renderlo sicuro multithread. QT usa sicuramente le funzioni lib char standard su linux ... –