Freigeben über


locale-Klasse

Die Klasse, die ein Gebietsschemaobjekt beschreibt, das kulturspezifische Informationen als einen Satz von Facets kapselt, die zusammen eine bestimmte lokalisierte Umgebung definieren.

Syntax

class locale;

Hinweise

Ein Facet ist ein Zeiger auf ein Objekt einer Klasse, die von der facet-Klasse abgeleitet wird. Diese verfügt über ein öffentliches Objekt in folgendem Format:

static locale::id id;

Sie können einen offenen Satz dieser Facets definieren. Sie können auch ein Gebietsschemaobjekt erstellen, das eine beliebige Anzahl von Facets festgelegt.

Vordefinierte Gruppen dieser Facets stellen die locale-Kategorien dar, die normalerweise in der Standard-C-Bibliothek von der Funktion setlocale verwaltet werden.

Kategorie collate (LC_COLLATE) enthält die Facets:

collate<char>
collate<wchar_t>

Kategorie ctype (LC_CTYPE) enthält die Facets:

ctype<char>
ctype<wchar_t>
codecvt<char, char, mbstate_t>
codecvt<wchar_t, char, mbstate_t>
codecvt<char16_t, char, mbstate_t>
codecvt<char32_t, char, mbstate_t>

Kategorie monetary (LC_MONETARY) enthält die Facets:

moneypunct<char, false>
moneypunct<wchar_t, false>
moneypunct<char, true>
moneypunct<wchar_t, true>
money_get<char, istreambuf_iterator<char>>
money_get<wchar_t, istreambuf_iterator<wchar_t>>
money_put<char, ostreambuf_iterator<char>>
money_put<wchar_t, ostreambuf_iterator<wchar_t>>

Kategorie numeric (LC_NUMERIC) enthält die Facets:

num_get<char, istreambuf_iterator<char>>
num_get<wchar_t, istreambuf_iterator<wchar_t>>
num_put<char, ostreambuf_iterator<char>>
num_put<wchar_t, ostreambuf_iterator<wchar_t>>
numpunct<char>
numpunct<wchar_t>

Kategorie time (LC_TIME) enthält die Facets:

time_get<char, istreambuf_iterator<char>>
time_get<wchar_t, istreambuf_iterator<wchar_t>>
time_put<char, ostreambuf_iterator<char>>
time_put<wchar_t, ostreambuf_iterator<wchar_t>>

Kategorie messages (LC_MESSAGES) umfasst die Facets:

messages<char>
messages<wchar_t>

(Die letzte Kategorie ist von POSIX erforderlich, aber nicht der C-Standard.)

Einige dieser vordefinierten Facets werden von den iostream Klassen verwendet, um die Konvertierung numerischer Werte in und aus Textsequenzen zu steuern.

Ein Objekt der locale-Klasse speichert einen Gebietsschemanamen als Objekt der Klasse string. Durch Verwenden eines ungültigen Gebietsschemanamens zur Erstellung eines Gebietsschemafacets oder eines Gebietsschemaobjekts wird ein Objekt der Klasse runtime_error ausgelöst. Der Name des gespeicherten Gebietsschemas ist "*" , wenn das Gebietsschema nicht sicher sein kann, dass ein Gebietsschema im C-Stil exakt dem gebietsschema entspricht, das durch das Objekt dargestellt wird. Andernfalls können Sie ein übereinstimmende Gebietsschema innerhalb der Standard-C-Bibliothek für ein Gebietsschemaobjekt locale_objecteinrichten, indem Sie den Namen().c_str()) aufrufensetlocale(LC_ALL , locale_object..

In dieser Implementierung können Sie außerdem die statische Memberfunktion aufrufen:

static locale empty();

zur Erstellung eines Gebietsschemaobjekts, das keine Facets hat. Es ist auch ein transparentes Gebietsschema. Wenn die Vorlagenfunktionen has_facet und use_facet das angeforderte Facet nicht in einem transparenten Gebietsschema finden können, konsultieren sie zuerst das globale Gebietsschema und dann, wenn dies transparent ist, das klassische Gebietsschema. Sie können also Folgendes schreiben:

cout.imbue(locale::empty());

Nachfolgende Einfügungen werden cout durch den aktuellen Zustand des globalen Gebietsschemas vermittelt. Sie können sogar Folgendes schreiben:

locale loc(locale::empty(),
    locale::classic(),
    locale::numeric);

cout.imbue(loc);

Numerische Formatierungsregeln für nachfolgende Einfügungen in cout bleiben gleich wie im C-Gebietsschema, auch wenn das globale Gebietsschema Änderungsregeln für das Einfügen von Datumsangaben und Währungswerten bietet.

Konstruktoren

Konstruktor Beschreibung
locale Erstellt ein Gebietsschema, eine Kopie eines Gebietsschemas oder eine Kopie des Gebietsschemas, in dem ein Facet oder eine Kategorie durch ein Facet oder eine Kategorie eines anderen Gebietsschemas ersetzt wurde.

TypeDefs

Typname Beschreibung
category Ein ganzzahliger Typ, der Bitmaskenwerte bereitstellt, um Standardfacetfamilien anzugeben.

Memberfunktionen

Memberfunktion Beschreibung
combine Fügt ein Facet eines angegebenen Gebietsschemas in ein Zielgebietsschema ein.
name Gibt den gespeicherten Gebietsschemanamen zurück.

Statische Funktionen

Name Beschreibung
Klassisch Die statische Memberfunktion gibt ein Gebietsschemaobjekt zurück, das das klassische C-Gebietsschema darstellt.
global Setzt das Standardgebietsschema für das Programm zurück.

Operatoren

Operator Beschreibung
operator= Weist ein Gebietsschema zu.
operator!= Prüft zwei Gebietsschemen auf Ungleichheit.
operator( ) Vergleicht zwei basic_string-Objekte.
operator== Prüft zwei Gebietsschemen auf Gleichheit.

Klassen

Klasse Beschreibung
facet Eine Klasse, die als Basisklasse für alle Gebietsschemafacets dient.
id Die Memberklasse stellt eine einzigartige Facetidentifikation bereit, die als Index zum Suchen von Facets in einem Gebietsschema verwendet wird.

Anforderungen

Header:<locale>

Namespace: std

locale::category

Ein ganzzahliger Typ, der Bitmaskenwerte bereitstellt, um Standardfacetfamilien anzugeben.

typedef int category;
static const int collate = LC_COLLATE;
static const int ctype = LC_CTYPE;
static const int monetary = LC_MONETARY;
static const int numeric = LC_NUMERIC;
static const int time = LC_TIME;
static const int messages = LC_MESSAGES;
static const int all = LC_ALL;
static const int none = 0;

Hinweise

Der Typ ist ein Synonym für einen int-Typ, der eine Gruppe von verschiedenen Elementen eines locale-Bitmaskentyps zur locale-Klasse darstellen kann oder als diese verwendet werden kann, um die entsprechenden C-Gebietsschemakategorien darstellen. Die Elemente sind:

  • collate, entsprechend der C-Kategorie LC_COLLATE

  • ctype, entsprechend der C-Kategorie LC_CTYPE

  • monetary, entsprechend der Kategorie C LC_MONETARY

  • numeric, entsprechend der Kategorie C LC_NUMERIC

  • time, entsprechend der C-Kategorie LC_TIME

  • messages, entsprechend der POSIX Kategorie LC_MESSAGES

Zwei weitere nützliche Werte sind:

  • none, die keiner der C-Kategorien entsprechen

  • all, die der C-Vereinigung aller Kategorien LC_ALL

Sie können eine beliebige Gruppe von Kategorien darstellen, indem Sie eine bitweise ODER mit diesen Konstanten verwenden, wie in monetary | time.

locale::classic

Die statische Memberfunktion gibt ein Gebietsschemaobjekt zurück, das das klassische C-Gebietsschema darstellt.

static const locale& classic();

Rückgabewert

Ein Verweis auf das C-Gebietsschema.

Hinweise

Das klassische C-Gebietsschema ist das us-amerikanische ASCII-Gebietsschema innerhalb der Standard C-Bibliothek. Es ist das Gebietsschema, das implizit in Programmen verwendet wird, die nicht internationalisiert sind.

Beispiel

// locale_classic.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: " << loc2.name( )
        << "." << endl;
   cout << "The name of the current locale is: " << loc1.name( )
        << "." << endl;

   if (loc2 == locale::classic( ) )
      cout << "The previous locale was classic." << endl;
   else
      cout << "The previous locale was not classic." << endl;

   if (loc1 == locale::classic( ) )
      cout << "The current locale is classic." << endl;
   else
      cout << "The current locale is not classic." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.
The previous locale was classic.
The current locale is not classic.

locale::combine

Fügt ein Facet eines angegebenen Gebietsschemas in ein Zielgebietsschema ein.

template <class Facet>
locale combine(const locale& source_locale) const;

Parameter

source_locale
Das Gebietsschema enthält das Facet, das in das Zielgebietsschema eingefügt werden soll.

Rückgabewert

Die Memberfunktion gibt ein Gebietsschemaobjekt zurück, das das in source_locale aufgelistete Facet Facet ersetzt oder hinzufügt*this.

Beispiel

// locale_combine.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main() {
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s; it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   locale loc2 ( "C" );
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   locale loc3 = loc2.combine<collate<_TCHAR> > (loc);
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;
}

facet-Klasse

Eine Klasse, die als Basisklasse für alle Gebietsschemafacets dient.

class facet {
protected:
    explicit facet(size_t references = 0);
    virtual ~facet();
private:
    facet(const facet&) // not defined
    void operator=(const facet&) // not defined
};

Hinweise

Sie können kein Objekt der Klasse facetkopieren oder zuweisen. Sie können Objekte, die von der Klasse locale::facet abgeleitet wurden, erstellen oder zerstören, aber nicht die Objekte der richtigen Basisklasse. In der Regel erstellen Sie ein Objekt _Myfac , das beim facet Erstellen eines locale, wie in locale loc(locale::classic(), new _Myfac);

In solchen Fällen sollte der Konstruktor für die Basisklasse facet ein Nullverweise-Argument aufweisen. Wenn das Objekt nicht mehr benötigt wird, wird es gelöscht. Geben Sie nur in seltenen Fällen ein Argument ohne Bezüge an, in denen Sie für die Lebensdauer des Objekts verantwortlich sind.

locale::global

Setzt das Standardgebietsschema für das Programm zurück. Dieser Aufruf wirkt sich auf das globale Gebietsschema sowohl für C als auch für C++ aus.

static locale global(const locale& new_default_locale);

Parameter

new_default_locale
Das Gebietsschema, das als Standardgebietsschema vom Programm verwendet werden soll.

Rückgabewert

Das vorherige Gebietsschema, bevor das Standardgebietsschema zurückgesetzt wurde.

Hinweise

Bei Programmstart ist das globale Gebietsschema gleich dem klassischen Gebietsschema. Die global()-Funktion ruft setlocale( LC_ALL, loc.name. c_str()) auf, um ein entsprechendes Gebietsschema in der Standard-C-Bibliothek festzulegen.

Beispiel

// locale_global.cpp
// compile by using: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( )
{
   locale loc ( "German_germany" );
   locale loc1;
   cout << "The initial locale is: " << loc1.name( ) << endl;
   locale loc2 = locale::global ( loc );
   locale loc3;
   cout << "The current locale is: " << loc3.name( ) << endl;
   cout << "The previous locale was: " << loc2.name( ) << endl;
}
The initial locale is: C
The current locale is: German_Germany.1252
The previous locale was: C

id-Klasse

Die Memberklasse stellt eine einzigartige Facetidentifikation bereit, die als Index zum Suchen von Facets in einem Gebietsschema verwendet wird.

class id
{
   protected:    id();
   private:      id(const id&)
   void operator=(const id&)  // not defined
};

Hinweise

Die Memberklasse beschreibt das statische Memberobjekt, das von jedem Gebietsschemafacet benötigt wird. Sie können kein Objekt der Klasse idkopieren oder zuweisen.

locale::locale

Erstellt ein Gebietsschema, eine Kopie eines Gebietsschemas oder eine Kopie des Gebietsschemas, in dem ein Facet oder eine Kategorie durch ein Facet oder eine Kategorie eines anderen Gebietsschemas ersetzt wurde. Enthält auch einen Destruktor.

locale();

explicit locale(const char* locale_name, category new_category = all);
explicit locale(const string& locale_name);
locale(const locale& from_locale);
locale(const locale& from_locale, const locale& Other, category new_category);
locale(const locale& from_locale, const char* locale_name, category new_category);

template <class Facet>
locale(const locale& from_locale, const Facet* new_facet);

~locale();

Parameter

locale_name
Der Name eines Gebietsschemas.

from_locale
Ein Gebietsschema, das zum Erstellen des neuen Gebietsschemas kopiert werden soll.

Andere
Ein Gebietsschema für die Auswahl einer Kategorie.

new_category
Die Kategorie, die im erstellten Gebietsschema ersetzt werden soll.

new_facet
Das Facet, das im erstellten Gebietsschema ersetzt werden soll.

Hinweise

Der erste Konstruktor initialisiert das Objekt, um mit dem globalen Gebietsschema übereinzustimmen. Die zweiten und dritten Konstruktoren initialisieren alle Gebietsschemakategorien, damit das Verhalten mit dem Gebietsschemanamen locale_name konsistent ist. Die neu Standard Konstruktoren kopieren from_locale mit den aufgeführten Ausnahmen:

locale(const locale& from_locale, const locale& Other, category new_category);

ersetzt von "Other " diese Facets, die einer Kategorie C entsprechen, für die C & new_category nonzero ist.

locale(const locale& from_locale, const char* locale_name, category new_category);

locale(const locale& from_locale, const string& locale_name, category new_category);

ersetzt diese locale(locale_name, all) Facets, die einer Kategorie replace_category entsprechen, für die replace_category & new_category kein Zero ist.

template<class Facet> locale(const locale& from_locale, Facet* new_facet);

ersetzt (oder fügt zu) from_locale das Facet new_facet, wenn new_facet kein Nullzeiger ist.

Wenn der Gebietsschemaname locale_name ein Nullzeiger oder anderweitig ungültig ist, löst die Funktion runtime_error aus.

Beispiel

// locale_locale.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( ) {

   // Second constructor
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s, it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   // The first (default) constructor
   locale loc2;
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   // Third constructor
   locale loc3 (loc2,loc, _M_COLLATE );
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;

   // Fourth constructor
   locale loc4 (loc2, "German_Germany", _M_COLLATE );
   int result4 = use_facet<collate<_TCHAR> > ( loc4 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc4 ) << result4 << endl;
}

locale::name

Gibt den gespeicherten Gebietsschemanamen zurück.

string name() const;

Rückgabewert

Eine Zeichenfolge, die den Namen des Gebietsschemas angibt.

Beispiel

// locale_name.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: "
        << loc2.name( ) << "." << endl;
   cout << "The name of the current locale is: "
        << loc1.name( ) << "." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.

locale::operator=

Weist ein Gebietsschema zu.

const locale& operator=(const locale& other) noexcept;

locale::operator!=

Prüft zwei Gebietsschemen auf Ungleichheit.

bool operator!=(const locale& right) const;

Parameter

right
Eines der Gebietsschemas, die auf Ungleichheit geprüft werden sollen.

Rückgabewert

Ein boolescher Wert, der lautet true , wenn die Gebietsschemas keine Kopien desselben Gebietsschemas sind. false Wenn es sich bei den Gebietsschemas um Kopien desselben Gebietsschemas handelt.

Hinweise

Zwei Gebietsschemas sind gleich, wenn sie dasselbe Gebietsschema sind, wenn es sich um eine Kopie der anderen handelt oder identische Namen haben.

Beispiel

// locale_op_ne.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 != loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are equal." << endl;

   if ( loc1 != loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are equal." << endl;
}
locales loc1 (German_Germany.1252) and
loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252) and
loc3 (English_United States.1252) are not equal.

locale::operator()

Vergleicht zwei basic_string Objekte gemäß den lexikographischen Vergleichsregeln, die durch das Facet dieses Gebietsschemas std::collate<charT> definiert sind.

template <class CharType, class Traits, class Allocator>
bool operator()(
    const basic_string<CharType, Traits, Allocator>& left,
    const basic_string<CharType, Traits, Allocator>& right) const;

Parameter

left
Die erste zu vergleichende Zeichenfolge.

right
Die zweite zu vergleichende Zeichenfolge.

Rückgabewert

  • true wenn links lexikalisch kleiner als rechts ist, andernfalls false.

Hinweise

Die Memberfunktion führt Folgendes aus:

const collate<CharType>& fac = use_fac<collate<CharType>>(*this);

return (fac.compare(left.begin(), left.end(), right.begin(), right.end()) < 0);

Dies bedeutet, dass Sie ein Gebietsschemaobjekt als Funktionsobjekt verwenden können.

Beispiel

// locale_op_compare.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

int main( )
{
   using namespace std;
   const wchar_t *sa = L"ztesting";
   const wchar_t *sb = L"\0x00DFtesting";
   basic_string<wchar_t> a( sa );
   basic_string<wchar_t> b( sb );

   locale loc( "German_Germany" );
   cout << loc( a,b ) << endl;

   const collate<wchar_t>& fac = use_facet<collate<wchar_t> >( loc );
   cout << ( fac.compare( sa, sa + a.length( ),
       sb, sb + b.length( ) ) < 0) << endl;
}
0
0

locale::operator==

Prüft zwei Gebietsschemen auf Gleichheit.

bool operator==(const locale& right) const;

Parameter

right
Eines der Gebietsschemas, die auf Gleichheit geprüft werden sollen.

Rückgabewert

Ein boolescher Wert, der angibt true , ob die Gebietsschemas Kopien desselben Gebietsschemas sind. false Wenn es sich bei den Gebietsschemas nicht um Kopien desselben Gebietsschemas handelt.

Hinweise

Zwei Gebietsschemas sind gleich, wenn sie dasselbe Gebietsschema sind, wenn es sich um eine Kopie der anderen handelt oder identische Namen haben.

Beispiel

// locale_op_eq.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 == loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are not equal."
      << endl;

   if ( loc1 == loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are not equal."
      << endl;
}
locales loc1 (German_Germany.1252)
and loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252)
and loc3 (English_United States.1252) are not equal.

Siehe auch

<locale>
Codepages
Gebietsschema-Namen, Sprachen und Zeichenfolgen für Länder und Regionen
Threadsicherheit in der C++-Standardbibliothek