locale 클래스

문화별 정보를 특정 지역별 환경을 전체적으로 정의하는 패싯 집합으로 캡슐화하는 로캘 개체에 대해 설명하는 클래스입니다.

구문

class locale;

설명

패싯은 다음 형식의 공용 개체를 가진 facet 클래스에서 파생된 클래스 개체에 대한 포인터입니다.

static locale::id id;

이러한 패싯의 개방형 집합을 정의할 수 있습니다. 또한 임의 수의 패싯을 지정하는 로캘 개체를 만들 수 있습니다.

이러한 패싯의 미리 정의된 그룹은 일반적으로 setlocale 함수에 의해 표준 C 라이브러리에서 관리되는 로캘 범주를 나타냅니다.

범주 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 표준에는 필요하지 않습니다.)

이러한 미리 정의된 패싯 중 일부는 텍스트 시퀀스와의 숫자 값 변환을 제어하기 위해 클래스에서 사용됩니다 iostream .

클래스 로캘 개체는 또한 로캘 이름을 string 클래스의 개체로 저장합니다. 잘못된 로캘 이름을 사용하여 로캘 패싯 또는 로캘 개체를 만들 경우 runtime_erro 클래스의 개체가 throw됩니다. 저장된 로캘 이름은 "*" 로캘 개체가 C 스타일 로캘이 개체가 나타내는 로캘과 정확히 일치하는지 확인할 수 없는 경우입니다. 그렇지 않으면 이름을().c_str()) 호출setlocale(LC_ALL , locale_object.하여 일부 로캘 개체locale_object에 대해 표준 C 라이브러리 내에서 일치하는 로캘을 설정할 수 있습니다.

이 구현에서는 정적 멤버 함수도 호출하여

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
로캘 패싯 또는 범주를 다른 로캘의 패싯 또는 범주로 대체한 경우 로캘 또는 로캘의 복사본을 만듭니다.

Typedef

형식 이름 설명
category 표준 패싯 범주를 나타내는 비트 마스크 값을 제공하는 정수 형식입니다.

멤버 함수

멤버 함수 설명
combine 지정된 로캘의 패싯을 대상 로캘로 삽입합니다.
이름 저장된 로캘 이름을 반환합니다.

정적 함수

이름 설명
기존 정적 멤버 함수는 클래식 C 로캘을 나타내는 로캘 개체를 반환합니다.
global 프로그램에 대한 기본 로컬을 다시 설정합니다.

연산자

연산자 설명
operator= 로캘을 할당합니다.
operator!= 두 로캘이 다른지 테스트합니다.
operator( ) basic_string 개체를 비교합니다.
연산자== 두 로캘이 같은지 테스트합니다.

클래스

클래스 설명
facet 모든 로캘 패싯에 대한 기본 클래스로 사용하는 클래스입니다.
id 멤버 클래스는 로캘의 패싯을 조회하기 위한 인덱스로 사용되는 고유한 패싯 ID를 제공합니다.

요구 사항

헤더:<로캘>

네임스페이스: std

로캘::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;

설명

이 형식은 클래스 로캘에 로컬인 비트 마스크 형식의 고유 요소 그룹을 나타내거나 해당 C 로캘 범주를 나타내는 데 사용할 수 있는 int 형식의 동의어입니다. 요소는 다음과 같습니다.

  • collateC 범주 LC_COLLATE 해당

  • ctypeC 범주 LC_CTYPE 해당

  • monetaryC 범주에 해당하는 LC_MONETARY

  • numericC 범주 LC_NUMERIC 해당

  • timeC 범주 LC_TIME 해당

  • messagesPOSIX 범주 LC_MESSAGES 해당

두 가지 더 유용한 값은 다음과 같습니다.

  • noneC 범주 중 어느 것도 해당하지 않음

  • all모든 범주 LC_ALL C 공용 구조체에 해당

와 같이 monetary | time이러한 상수와 함께 비트 OR을 사용하여 임의의 범주 그룹을 나타낼 수 있습니다.

로캘::classic

정적 멤버 함수는 클래식 C 로캘을 나타내는 로캘 개체를 반환합니다.

static const locale& classic();

Return Value

C 로캘에 대한 참조입니다.

설명

클래식 C 로캘은 표준 C 라이브러리 내의 미국 영어 ASCII 로캘입니다. 국제화되지 않은 프로그램에서 암시적으로 사용되는 로캘입니다.

예시

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

로캘::combine

지정된 로캘의 패싯을 대상 로캘로 삽입합니다.

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

매개 변수

source_locale
대상 로캘에 삽입할 패싯을 포함하는 로캘입니다.

Return Value

멤버 함수는 source_locale 나열된 패싯을 대체하거나 패싯 Facet*this 추가하는 로캘 개체를 반환합니다.

예시

// 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 클래스에서 파생된 개체는 생성하고 삭제할 수 있지만 기본 클래스 proper의 개체는 생성하고 삭제할 수 없습니다. 일반적으로 다음과 같이 생성할 때 파생된 facet 개체 _Myfaclocale생성합니다.locale loc(locale::classic(), new _Myfac);

이러한 경우 기본 클래스 facet 의 생성자에는 참조 인수가 0이어야 합니다. 개체가 더 이상 필요하지 않으면 삭제됩니다. 개체의 수명 동안 책임을 지는 드문 경우에만 0이 아닌 참조 인수를 제공합니다.

로캘::global

프로그램에 대한 기본 로캘을 다시 설정하며, 이 호출은 C 및 C++에 대한 전역 로캘에 영향을 줍니다.

static locale global(const locale& new_default_locale);

매개 변수

new_default_locale
프로그램에서 기본 로캘로 사용할 로캘입니다.

Return Value

기본 로캘이 다시 설정되기 전의 이전 로캘입니다.

설명

프로그램이 시작될 때는 전역 로캘이 클래식 로캘과 같습니다. 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 클래스

멤버 클래스는 로캘의 패싯을 조회하기 위한 인덱스로 사용되는 고유한 패싯 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 &new_category 0이 아닌 C 범주에 해당하는 다른 패싯에서 대체합니다.

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

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

는 0이 아닌 범주 replace_categoryreplace_category & new_category 해당하는 패싯에서 locale(locale_name, all) 대체됩니다.

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

new_facet null 포인터가 아닌 경우 패싯 new_facet from_locale을 대체하거나 추가 합니다.

로캘 이름 locale_name null 포인터이거나 유효하지 않은 경우 함수는 runtime_error throw합니다.

예시

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

Return Value

로캘의 이름을 지정하는 문자열입니다.

예시

// 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
같지 않음을 테스트할 로캘 중 하나입니다.

Return Value

로캘이 동일한 로캘의 복사본이 아닌 경우의 부울 값입니다 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()

이 로캘의 std::collate<charT> 패싯에서 정의한 사전 비교 규칙에 따라 두 basic_string 개체를 비교합니다.

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
비교할 둘째 문자열입니다.

Return Value

  • 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
같은지 여부를 테스트할 로캘 중 하나입니다.

Return Value

로캘이 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++ 표준 라이브러리의 스레드 보안