Поделиться через


Класс locale

Класс, описывающий объект языкового стандарта, инкапсулирующий данные по соответствующей культуре в качестве набора аспектов, которые собирательно определяют ту или иную локализованную среду.

Синтаксис

class locale;

Замечания

Аспект — это указатель на объект класса, выведенного производным от класса facet, который обладает общим объектом в формате:

static locale::id id;

Можно задать открытый набор данных аспектов. Можно также создать объект языкового стандарта, назначающий произвольное количество аспектов.

Предопределенные группы этих аспектов представляют категории языкового стандарта, которыми в стандартной библиотеке C традиционно управляет функция setlocale.

Категория collate (LC_COLLATE) включает аспекты:

collate<char>
collate<wchar_t>

Категория ctype (LC_CTYPE) включает аспекты:

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>

Категория monetary (LC_MONETARY) включает аспекты:

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>>

Категория numeric (LC_NUMERIC) включает аспекты:

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>

Категория time (LC_TIME) включает аспекты:

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>>

Категория messages (LC_MESSAGES) включает аспекты:

messages<char>
messages<wchar_t>

(Последняя категория требуется POSIX, но не C Standard.)

Некоторые из этих предопределенных аспектов используются классами iostream для управления преобразованием числовых значений в текстовые последовательности и из них.

Объект класса locale также сохраняет имя языкового стандарта в качестве объекта класса string. Использование недопустимого имени языкового стандарта для создания аспекта языкового стандарта или объекта языкового стандарта создает объект класса runtime_error. Сохраненное имя языкового стандарта заключается "*" в том, что объект языкового стандарта не может быть уверен, что языковой стандарт в стиле C соответствует точно одному, представленному объектом. В противном случае можно установить соответствующий языковой стандарт в стандартной библиотеке C для определенного объекта locale_objectязыкового стандарта, вызвав setlocale(LC_ALL , locale_object.имя().c_str()).

В данном случае можно также вызвать статическую функцию-член:

static locale empty();

создать объект языкового стандарта без аспектов. Это также прозрачный языковой стандарт. Если функции шаблона has_facet и use_facet не могут найти запрошенный аспект в прозрачном языковом стандарте, они сначала обращаются к глобальному языковому стандарту, а затем, если это прозрачно, классический языковой стандарт. Можно написать:

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

Последующие вставки cout , которые будут опосредованы текущим состоянием глобального языкового стандарта. Можно даже написать:

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

cout.imbue(loc);

Числовые правила форматирования для последующих вставок в cout остаются такими же, как в языковом стандарте C, даже если глобальный языковой стандарт предоставляет другие правила вставки дат и денежных сумм.

Конструкторы

Конструктор Description
локаль Создает языковой стандарт, копию языкового стандарта или копию языкового стандарта, в которой аспект или категория заменены аспектом или категорией из другого языкового стандарта.

Определения типов

Введите имя Description
category Целочисленный тип, который содержит значения битовой маски для обозначения стандартных семейств аспектов.

Функции элементов

Функция-член Description
combine Вставляет аспект из определенного языкового стандарта в целевой языковой стандарт.
name Возвращает имя сохраненного языкового стандарта.

Статические функции

Имя Описание
классическая Данная статическая функция-член возвращает объект языкового стандарта, представляющий классический языковой стандарт C.
global Сброс языкового стандарта программы по умолчанию.

Операторы

Operator Description
operator= Назначает языковой стандарт.
оператор!= Проверка двух языковых стандартов на неравенство.
оператор( ) Сравнивает два объекта basic_string.
operator== Проверка двух языковых стандартов на равенство.

Классы

Класс Description
facet Класс, используемый как базовый класс для всех аспектов языкового стандарта.
id Класс члена содержит уникальный идентификатор аспекта, применяемый в качестве индекса для поиска аспектов в языковом стандарте.

Requirements

Заголовок:<языковой стандарт>

Пространство имен: std

locale::category

Целочисленный тип, который содержит значения битовой маски для обозначения стандартных семейств аспектов.

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;

Замечания

Тип является синонимом типа int, который может представлять группу различающихся элементов типа bitmask, локальных для класса языкового стандарта, или может использоваться для представления любой из соответствующих категорий языкового стандарта C. Элементы:

  • collate, соответствующий категории C LC_COLLATE

  • ctype, соответствующий категории C LC_CTYPE

  • monetary, соответствующий категории C LC_MONETARY

  • numeric, соответствующий категории C LC_NUMERIC

  • time, соответствующий категории C LC_TIME

  • messages, соответствующий категории POSIX LC_MESSAGES

Ниже приведены два дополнительных полезных значения:

  • none, соответствующий ни одной из категорий C

  • all, соответствующий союзу C всех категорий LC_ALL

Вы можете представлять произвольную группу категорий, используя побитовую или с этими константами, как в monetary | time.

языковой стандарт::classic

Данная статическая функция-член возвращает объект языкового стандарта, представляющий классический языковой стандарт C.

static const locale& classic();

Возвращаемое значение

Ссылка на языковой стандарт C.

Замечания

Классический языковой стандарт C — это языковой стандарт ASCII в стандартной библиотеке C. Это языковой стандарт, который используется неявно в программах, которые не интернационализированы.

Пример

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

Вставляет аспект из определенного языкового стандарта в целевой языковой стандарт.

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

Параметры

source_locale
Языковой стандарт, содержащий аспект для вставки в целевой языковой стандарт.

Возвращаемое значение

Функция-член возвращает объект языкового стандарта, который заменяет или добавляет *this в аспект Facet , указанный в source_locale.

Пример

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

Класс, используемый как базовый класс для всех аспектов языкового стандарта.

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

Замечания

Невозможно скопировать или назначить объект класса facet. Можно создавать и удалять объекты, производные от класса locale::facet, но не объекты правильного базового класса. Как правило, вы создаете объект _Myfac , производный от facet создания localeобъекта , как в locale loc(locale::classic(), new _Myfac);

В таких случаях конструктор базового класса facet должен иметь аргумент нулевой ссылки . Если объект больше не нужен, он удаляется. Укажите аргумент ненулевого ссылки только в тех редких случаях, когда вы несете ответственность за время существования объекта.

языковой стандарт::global

Сброс языкового стандарта по умолчанию для программы. Этот вызов влияет на глобальный языковой стандарт для C и C++.

static locale global(const locale& new_default_locale);

Параметры

new_default_locale
Языковой стандарт, который будет использоваться программой по умолчанию.

Возвращаемое значение

Языковой стандарт до сброса языкового стандарта по умолчанию.

Замечания

При запуске программы глобальный языковой стандарт совпадает в классическим языковым стандартом. Функция global() вызывает setlocale( LC_ALL, loc.name. c_str()) для установки соответствующего языкового стандарта в стандартной библиотеке C.

Пример

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

Класс члена содержит уникальный идентификатор аспекта, применяемый в качестве индекса для поиска аспектов в языковом стандарте.

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

Замечания

Класс-член описывает статический объект-член, необходимый для каждого уникального аспекта языкового стандарта. Невозможно скопировать или назначить объект класса id.

locale::locale

Создает языковой стандарт, копию языкового стандарта или копию языкового стандарта, в которой аспект или категория заменены аспектом или категорией из другого языкового стандарта. Также включает деструктор.

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();

Параметры

locale_name
Имя языкового стандарта.

from_locale
Языковой стандарт, который будет копироваться при создании нового языкового стандарта.

Другое
Языковой стандарт, из которого будет выбираться категория.

new_category
Категория для замены в созданном языковом стандарте.

new_facet
Аспект для замены в созданном языковом стандарте.

Замечания

Первый конструктор инициализирует объект для соответствия глобальному языковому стандарту. Второй и третий конструкторы инициализирует все категории языкового стандарта, чтобы иметь поведение, согласованное с именем языкового стандарта locale_name. Остальные конструкторы копируют from_locale, за исключением следующих исключений:

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

заменяет из других аспектов, соответствующих категории C, для которой C и new_category ненулевое значение.

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

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

заменяет из locale(locale_name, all) этих аспектов, соответствующих категории replace_category , для которой replace_category & new_category ненулевое значение.

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

заменяет from_locale from_locale аспекте new_facet, если new_facet не является указателем null.

Если имя языкового стандарта locale_name является указателем null или недопустимым, функция вызывает runtime_error.

Пример

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

Возвращает имя сохраненного языкового стандарта.

string name() const;

Возвращаемое значение

Строка, задающая имя языкового стандарта.

Пример

// 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=

Назначает языковой стандарт.

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

locale::operator!=

Проверка двух языковых стандартов на неравенство.

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

Параметры

right
Один из языковых стандартов для проверки на неравенство.

Возвращаемое значение

Логическое значение, указывающее true , что языковые стандарта не копируются в одном языковом стандарте. Это если false языковые стандарты копируются с тем же языковым стандартом.

Замечания

Два языковых стандарта равны, если они одинаковый языковой стандарт, если один является копией другого, или если они имеют идентичные имена.

Пример

// 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()

Сравнивает два basic_string объекта в соответствии с правилами лексографического сравнения, определенными аспектом этого языкового std::collate<charT> стандарта.

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

Параметры

left
Первая сравниваемая строка.

right
Вторая сравниваемая строка.

Возвращаемое значение

  • trueЗначение лексографически меньше справа, в противном случае false.

Замечания

Функция-член фактически выполняет:

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

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

Это означает, что в качестве объекта функции можно использовать объект языкового стандарта.

Пример

// 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==

Проверка двух языковых стандартов на равенство.

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

Параметры

right
Один из языковых стандартов для проверки на равенство.

Возвращаемое значение

Логическое значение, указывающее true , что языковые стандарта копируются в одном языковом стандарте. Это если false языковые стандарты не являются копиями одного языкового стандарта.

Замечания

Два языковых стандарта равны, если они одинаковый языковой стандарт, если один является копией другого, или если они имеют идентичные имена.

Пример

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

См. также

<локаль>
Кодовые страницы
Сведения о строках имени языкового стандарта, языка, а также страны или региона
Потокобезопасность в стандартной библиотеке C++