locale 类
一种描述区域设置对象的类,此对象用于将特定于文化的信息封装为一组 facet 以共同定义特定本地化环境。
语法
class locale;
备注
facet 是指向派生自 facet 类的类对象的指针,该类具有以下格式的公共对象:
static locale::id id;
可以定义这些 facet 的开放式集。 还可以构建指定任意个 facet 的区域设置对象。
这些 facet 的预定义组表示传统上在标准 C 库中由函数 setlocale
管理的区域设置类别。
类别 collate
(LC_COLLATE) 包括以下 facet:
collate<char>
collate<wchar_t>
类别 ctype
(LC_CTYPE) 包括以下 facet:
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) 包括以下 facet:
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) 包括以下 facet:
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) 包括以下 facet:
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) 包括以下 facet:
messages<char>
messages<wchar_t>
(最后一个类别是 POSIX 需要而非 C 标准需要的类别。)
其中某些预定义的 facet 由 iostream
类使用,用来控制数值与文本序列的相互转换。
locale 类的对象还将区域设置名称存储为字符串类的对象。 若使用无效区域设置名称构造区域设置 facet 或区域设置对象,将引发 runtime_error 类的对象。 如果区域设置对象无法确定 C 样式区域设置与此对象表示的区域设置完全对应,则存储的区域设置名称为 "*"
。 如果能够确定,可以在标准 C 库中通过调用 setlocale(LC_ALL , locale_object.
name().c_str())
为某个区域设置对象 locale_object
建立匹配的区域设置。
在此实现中,还可以调用静态成员函数:
static locale empty();
构造不包含 facet 的区域设置对象。 这也是透明区域设置。 如果模板函数 has_facet 和 use_facet 在透明区域设置中找不到请求的 facet,将先参考全局区域设置,如果此为透明区域设置,则将再参考经典区域设置。 因此,可以写入:
cout.imbue(locale::empty());
对 cout
的后续插入通过全局区域设置的当前状态调整。 你还可以编写:
locale loc(locale::empty(),
locale::classic(),
locale::numeric);
cout.imbue(loc);
对 cout
的后续插入的数值格式设置规则与 C 区域设置相同,即使全局区域设置提供有关插入日期和货币金额的更改规则也是如此。
构造函数
构造函数 | 说明 |
---|---|
区域设置 | 创建区域设置、区域设置副本,或其中的 facet 或类别替换为其他区域设置中的 facet 类别的区域设置副本。 |
Typedef
类型名称 | 说明 |
---|---|
category | 一种整数类型,此类型提供位掩码值以表示标准 facet 系列。 |
成员函数
成员函数 | 说明 |
---|---|
combine | 将指定区域设置中的 facet 插入到目标区域设置。 |
name | 返回存储的区域设置名称。 |
静态函数
名称 | 描述 |
---|---|
经典 | 此静态成员函数返回表示经典 C 区域设置的区域设置对象。 |
global | 重置程序的默认区域设置。 |
运算符
运算符 | 说明 |
---|---|
operator= | 分配一个区域设置。 |
operator!= | 测试两个区域设置是否不相等。 |
operator( ) | 比较两个 basic_string 对象。 |
operator== | 测试两个区域设置是否相等。 |
类
类 | 说明 |
---|---|
facet | 一种类,此类用作所有区域设置 facet 的基类。 |
id |
成员类提供用作索引以查找区域设置中的 facet 的唯一 facet 标识。 |
要求
标头:<locale>
命名空间: std
locale::category
一种整数类型,此类型提供位掩码值以表示标准 facet 系列。
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
的同义词,可表示类区域设置的本地位掩码类型的一组非重复元素,或可用于表示任何对应的 C 区域设置类别。 这些元素为:
collate
,对应于 C 类 LC_COLLATEctype
,对应于 C 类 LC_CTYPEmonetary
,对应于 C 类 LC_MONETARYnumeric
,对应于 C 类 LC_NUMERICtime
,对应于 C 类 LC_TIMEmessages
,对应于 POSIX 类 LC_MESSAGES
还有两个有用的值:
none
,不对应任何 C 类all
,对应于所有 C 类 LC_ALL
可以通过将 bitwise-OR 与这些常量配合使用来表示任意一组类别,如 monetary | time
。
locale::classic
此静态成员函数返回表示经典 C 区域设置的区域设置对象。
static const locale& classic();
返回值
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.
locale::combine
将指定区域设置中的 facet 插入到目标区域设置。
template <class Facet>
locale combine(const locale& source_locale) const;
参数
source_locale
包含要插入到目标区域设置的 facet 的区域设置。
返回值
该成员函数将返回一个区域设置对象,该对象在 source_locale 中列出的 *this
the facet Facet
中进行替换或添加到其中。
示例
// 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 类
一种类,此类用作所有区域设置 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
的对象,但不能构造和销毁适当的基类对象。 通常情况下,构造 locale
时将构造一个派生自 facet
的对象 _Myfac
,如 locale loc(locale::classic(), new _Myfac);
在这种情况下,基类 facet
的构造函数应具有一个零 references 自变量。 当不再需要该对象时,将删除。 仅在负责该对象的生存期这样极少数情况下提供非零 references 自变量。
locale::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
成员类提供用作索引以查找区域设置中的 facet 的唯一 facet 标识。
class id
{
protected: id();
private: id(const id&)
void operator=(const id&) // not defined
};
注解
该成员类描述每个唯一区域设置 facet 所需的静态成员对象。 不能复制或分配类 id
的对象。
locale::locale
创建区域设置、区域设置副本,或其中的 facet 或类别替换为其他区域设置中的 facet 类别的区域设置副本。 还包括一个析构函数。
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
要替换为构造的区域设置的 facet。
注解
第一个构造函数将初始化该对象,以便匹配全局构造函数。 第二和第三个构造函数初始化所有区域设置类别,以便具有与区域设置名称 locale_name 一致的行为。 剩余的构造函数将复制 from_locale,并出现以下异常:
locale(const locale& from_locale, const locale& Other, category new_category);
从 Other 替换对应于 C & new_category 为非零值的某个类别 C 的 facet。
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 的 facet,其 replace_category & new_category
为非零值。
template<class Facet> locale(const locale& from_locale, Facet* new_facet);
如果 new_facet 不是空指针,则在 from_locale 中替换(或添加到)facet new_facet。
如果区域设置名称 locale_name 为空指针或无效,则该函数将引发 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()
根据此区域设置的 std::collate<charT>
facet 定义的词典比较规则,比较两个 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
要比较的第二个字符串。
返回值
- 如果 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.