Wie erhalte ich das aktuelle Gebietsschema meiner Umgebung?

Lesezeit: 4 Minuten

Hatte folgenden Code in Linux versucht, aber immer ‘C’ unter different zurückgegeben LANG die Einstellungen.

#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

Was soll ich tun, um die aktuelle Gebietsschemaeinstellung in Linux (wie Ubuntu) zu erhalten?

Eine andere Frage ist, ist es der gleiche Weg, um das Gebietsschema in Windows zu erhalten?

  • In C und C++ beginnt das Gebietsschema immer mit dem Gebietsschema “C”. Sie müssen ausdrücklich darum bitten, dass das Gebietsschema des Programms auf das Gebietsschema der Umgebung geändert wird.

    – Namen53

    29. August 2012 um 23:01 Uhr

Aus man 3 setlocale (Neue Maxime: “Im Zweifelsfall die gesamte Manpage lesen.”):

Wenn Gebietsschema ist ""wird jeder Teil des Gebietsschemas, der geändert werden soll, gemäß den Umgebungsvariablen festgelegt.

Wir können also die Umgebungsvariablen durch Aufrufen lesen setlocale zu Beginn des Programms wie folgt:

#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;
}

Mein System unterstützt das nicht zh_CN Gebietsschema, wie die folgende Ausgabe zeigt:

$ ./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

Fenster: Ich habe keine Ahnung von Windows-Gebietsschemata. Ich schlage vor, mit einem anzufangen MSDN-Sucheund öffnen Sie dann a getrennt Stack Overflow-Frage, wenn Sie noch Fragen haben.

  • Vielen Dank. Gibt es eine C++-Version zum Abrufen des aktuellen Gebietsschemas? Ich nehme an, es sollte drin sein <locale> aber keine ahnung wie man es benutzt.

    – Deqing

    29. August 2012 um 4:57 Uhr

  • @Deqing: Ich habe keine Ahnung. Dokumentation suchen. google.com/search?q=c%2B%2B+Gebietsschema

    – Dietrich Ep

    29. August 2012 um 5:26 Uhr

  • Beachten Sie, dass Windows-Systeme häufig zurückkehren English_United States Anstatt von en-US und möglicherweise mit angehängter Codepage, normalerweise English_United States.1252.

    – Jesse Chisholm

    15. Juni 2018 um 1:04 Uhr

  • Für Windows gibt es auch eine Funktion strftime_l, die ein privates lokales Objekt übernimmt, ohne das globale Gebietsschema zu ändern: docs.microsoft.com/en-us/cpp/c-runtime-library/reference/…

    – ROTER WEICHER ADAIR

    17. Juli 2019 um 11:38 Uhr

Ich habe gerade herausgefunden, wie man das Gebietsschema von C++ erhält. Verwenden Sie einfach eine leere Zeichenfolge “”, um std::locale zu erstellen, was dasselbe tut wie setlocale(LC_ALL, “”).

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

Dies Verknüpfung Unterschiede in Details zwischen C-Locale und C++-Locale beschrieben.

  • setlocale(LC_ALL, “”) setzt das System standardmäßig auf lokal. Verwenden Sie setlocale(LC_ALL, NULL), um das aktuelle Gebietsschema abzurufen

    – Kishan Vaishnav

    30. November 2018 um 8:57 Uhr

Verwenden Sie für Windows den folgenden Code:

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;

Dies wird so etwas wie “en-US” drucken.

Um Unterspracheninformationen zu löschen, verwenden Sie Folgendes:

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;

Dies gibt Ihnen nur “en”.

Eine gute Alternative zu std::locale ist boost::locale, die zuverlässigere Informationen zurückgeben kann – siehe http://www.boost.org/doc/libs/1_52_0/libs/locale/doc/html/locale_information.html

boost::locale::info hat die folgenden Member-Funktionen:

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.

Das Standardkonstruktor von std::locale erstellt eine Kopie des globalen C++-Gebietsschemas.

So erhalten Sie den Namen des aktuellen Gebietsschemas:

std::cout << std::locale().name() << '\n';

1383270cookie-checkWie erhalte ich das aktuelle Gebietsschema meiner Umgebung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy