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?
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.
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.
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';
13832700cookie-checkWie erhalte ich das aktuelle Gebietsschema meiner Umgebung?yes
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