2014-09-06 3 views
1

Je cherche un moyen de définir les paramètres régionaux sur l'ensemble du programme, si cela est possible.C++ Définir les paramètres régionaux sur l'ensemble du programme

Je définissez les paramètres régionaux dans ma principale fonction comme ceci:

int main() 
{ 
    setlocale(LC_ALL, ""); 
    .... 
    return 0; 
} 

Cependant, il n «t définir les paramètres régionaux à mes classes/méthodes différentes à travers l'ensemble du programme I » d préfére ne pas écrire cette ligne au-dessus de chaque méthode qui sera imprimé sur l'écran et la création d'un C++ objet locale et le passage autour doesn "t sentir tout à fait acceptable.

Merci pour votre temps.

+0

'setlocale' est déjà mondiale, pour les choses qu'il est censé affecter . Quels types de choses utilisent ces autres méthodes? Si je me souviens bien, 'setlocale' affecte les anciennes API" C-like "mais ne touche pas à des choses comme les flux" cout' "et C++. – TheUndeadFish

+0

J'ai une classe qui lit à partir d'un fichier et en mesure son contenu. Ca me renverse des ordures parce que certaines lettres ont des accents. setlocale défini dans le principal, mais ne semble pas affecter cette deuxième classe. – Tristan

+0

Ce n'est pas assez spécifique pour exclure de nombreuses possibilités ... Vous utilisez peut-être quelque chose que setlocale n'affecte pas, comme std :: fstream. Ou le problème pourrait être avec cout et la console. Ou les données de votre fichier pourraient être dans un encodage qui ne sera pas converti comme vous le souhaitez. Etc. À ce stade, je pense que vous devriez soit éditer cette question ou en poster une nouvelle couvrant le problème que vous rencontrez et poster le code de la façon dont vous lisez le fichier et l'envoi des données par cout. – TheUndeadFish

Répondre

6

les deux fonctions qui modifient les paramètres régionaux globaux sont std::setlocale et std::locale::global. Toutes les futures E/S C et C++ et la manipulation de chaînes les utiliseront, à l'exception des six flux C++ E/S standard, qui sont construits avant que votre code ne s'exécute. Vous devrez peut-être les imbiber individuellement:

#include <locale> 
#include <clocale> 
int main() 
{ 
    std::setlocale(LC_ALL, ""); // for C and C++ where synced with stdio 
    std::locale::global(std::locale("")); // for C++ 
    std::cout.imbue(std::locale()); 
    // cerr, clog, wcout, wcerr, wclog as needed 
1

setlocale utilisé pour définir les paramètres régionaux, mais sa portée si décidé par le premier paramètre (c.-à-flag) que nous passons. Dans votre cas, "LC_ALL".

Il existe deux façons de définir les paramètres régionaux. Ainsi, selon le comportement du setlocale, si vous passez le second paramètre à "" ou à NULL, il prend la valeur par défaut de l'environnement système (LANG). Code de référence ci-dessous:

setenv("LANG","en_US.utf8",1); 
cout << "GET ENV .... " << getenv("LANG"); 
setlocale(LC_ALL,""); 

L'autre façon est d'utiliser les paramètres régionaux, comme ci-dessous:

setlocale(LC_ALL,"en_US.utf8"); 

Code Illustration

Questions connexes