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
형식의 동의어입니다. 요소는 다음과 같습니다.
collate
C 범주 LC_COLLATE 해당ctype
C 범주 LC_CTYPE 해당monetary
C 범주에 해당하는 LC_MONETARYnumeric
C 범주 LC_NUMERIC 해당time
C 범주 LC_TIME 해당messages
POSIX 범주 LC_MESSAGES 해당
두 가지 더 유용한 값은 다음과 같습니다.
none
C 범주 중 어느 것도 해당하지 않음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
개체 _Myfac
를 locale
생성합니다.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_category replace_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.