web-dev-qa-db-fra.com

Comment obtenir les paramètres régionaux actuels de mon environnement?

Avait essayé de suivre le code sous Linux, mais renvoyait toujours "C" sous différents paramètres LANG.

#include <iostream>
#include <locale.h>
#include <locale>
using namespace std;

int main()
{
    cout<<"locale 1: "<<setlocale(LC_ALL, NULL)<<endl;
    cout<<"locale 2: "<<setlocale(LC_CTYPE, NULL)<<endl;

    locale l;
    cout<<"locale 3: "<<l.name()<<endl;
}

$ ./a.out
locale 1: C
locale 2: C
locale 3: C
$
$ export LANG=zh_CN.UTF-8
$ ./a.out
locale 1: C
locale 2: C
locale 3: C

Que dois-je faire pour obtenir les paramètres régionaux actuels sous Linux (comme Ubuntu)?

Une autre question est, est-ce la même manière d'obtenir les paramètres régionaux dans Windows?

29
Deqing

De man 3 setlocale (Nouvelle maxime: "En cas de doute, lisez l'intégralité de la page de manuel."):

Si les paramètres régionaux sont "", chaque partie des paramètres régionaux à modifier est définie en fonction des variables d'environnement.

Ainsi, nous pouvons lire les variables d'environnement en appelant setlocale au début du programme, comme suit:

#include <iostream>
#include <locale.h>
using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    cout << "LC_ALL: " << setlocale(LC_ALL, NULL) << endl;
    cout << "LC_CTYPE: " << setlocale(LC_CTYPE, NULL) << endl;
    return 0;
}

Mon système ne prend pas en charge le zh_CN locale, comme le révèle la sortie suivante:

 $ ./a.out 
 LC_ALL: en_US.utf8 
 LC_CTYPE: en_US.utf8 
 $ export LANG = zh_CN.UTF-8 
 $ ./a.out 
 LC_ALL: C 
 LC_CTYPE: C 

Windows: Je n'ai aucune idée des paramètres régionaux Windows. Je suggère de commencer par une recherche MSDN , puis d'ouvrir une question séparée Stack Overflow si vous avez encore des questions.

22
Dietrich Epp

Je viens de découvrir comment obtenir les paramètres régionaux en C++, utilisez simplement une chaîne vide "" pour construire std :: locale, qui fait la même chose que setlocale (LC_ALL, "").

locale l("");
cout<<"Locale by C++: "<<l.name()<<endl;

Ce lien décrit les différences de détails entre les paramètres régionaux C et les paramètres régionaux C++.

19
Deqing

Une bonne alternative à considérer au lieu de std :: locale est boost :: locale qui est capable de renvoyer des informations plus fiables - voir http://www.boost.org/doc/libs/1_52_0/libs/locale/ doc/html/locale_information.html

boost :: locale :: info a les fonctions membres suivantes:

std::string name() -- the full name of the locale, for example en_US.UTF-8
std::string language() -- the ISO-639 language code of the current locale, for example "en".
std::string country() -- the ISO-3199 country code of the current locale, for example "US".
std::string variant() -- the variant of current locale, for example "euro".
std::string encoding() -- the encoding used for char based strings, for example "UTF-8"
bool utf8() -- a fast way to check whether the encoding is UTF-8.
2
Riot

Pour Windows, utilisez le code suivant:

LCID lcid = GetThreadLocale();
wchar_t name[LOCALE_NAME_MAX_LENGTH];
if (LCIDToLocaleName(lcid, name, LOCALE_NAME_MAX_LENGTH, 0) == 0)
    error(GetLastError());
std::wcout << L"Locale name = " << name << std::endl;

Cela va imprimer quelque chose comme "en-US".

Pour purger les informations de sous-langue, utilisez les éléments suivants:

wchar_t parentLocateName[LOCALE_NAME_MAX_LENGTH];
if (GetLocaleInfoEx(name, LOCALE_SPARENT, parentLocateName, LOCALE_NAME_MAX_LENGTH) == 0)
    error(GetLastError());
std::wcout << L"parentLocateName = " << parentLocateName << std::endl;

Cela vous donnera juste "en".

1
zzz