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 標準では必要ありません。)

これらの定義済みのファセットの一部は、数値とテキスト シーケンスとの変換を制御するために、iostream クラスによって使用されます。

クラス ロケールのオブジェクトは、ロケール名を string クラスのオブジェクトとして格納します。 無効なロケール名を使用してロケールのファセットまたはロケール オブジェクトを構築すると、runtime_error クラスのオブジェクトがスローされます。 ロケール オブジェクトで、C スタイルのロケールがオブジェクトによって表されるロケールに正確に対応するかどうかを確認できない場合、格納されるロケール名は "*" です。 それ以外の場合は、ロケール オブジェクト locale_object について、setlocale(LC_ALL , locale_object.name().c_str()) を呼び出すことによって、標準 C ライブラリ内で一致するロケールを設定できます。

この実装では、次の静的メンバー関数を呼び出すことによって、

static locale empty();

ファセットがないロケール オブジェクトを構築することもできます。 これは、透過的ロケールでもあります。 テンプレート関数 has_facetuse_facet で要求されたファセットを透過的ロケール内で見つけることができなかった場合、最初にグローバル ロケールを参照し、次にクラシック ロケールを参照します (透過的な場合)。 つまり、次のように記述できます。

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

cout への以降の挿入は、グローバル ロケールの現在の状態に基づいて仲介されます。 次のように記述することもできます。

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

cout.imbue(loc);

cout への以降の挿入についての数値書式設定規則は、グローバル ロケールで日付や金額の挿入についての変更規則が提供されている場合でも、C のロケールの場合と同様です。

コンストラクター

コンストラクター 説明
locale ロケール、ロケールのコピー、またはファセットやカテゴリが別のロケールのファセットやカテゴリで置換されたロケールのコピーを作成します。

Typedefs

型名 説明
category 標準ファセット ファミリを示すビットマスク値を指定する整数型。

メンバー関数

メンバー関数 説明
combine ターゲット ロケールに指定されたロケールのファセットを挿入します。
name 格納されているロケール名を返します。

静的関数

名前 説明
classic この静的メンバー関数は、クラシック C ロケールを表すロケール オブジェクトを返します。
global プログラムの既定のロケールをリセットします。

演算子

演算子 説明
operator= ロケールを割り当てます。
operator!= 2 つのロケールが等しくないかどうかをテストします。
operator( ) 2 つの basic_string オブジェクトを比較します。
operator== 2 つのロケールが等しいかどうかをテストします。

クラス

クラス 説明
facet すべてのロケールのファセットの基底クラスとして機能するクラス。
id このメンバー クラスは、ロケール内でファセットを検索するためのインデックスとして使用される一意のファセット ID を提供します。

要件

ヘッダー: <locale>

名前空間: 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;

解説

型は、クラス ロケールに固有のビットマスク型の個々の要素のグループを表すか、または対応する C ロケールのカテゴリのいずれかを表すために使用できる int 型のシノニムです。 要素は次のとおりです。

  • collate: C カテゴリ LC_COLLATE に対応

  • ctype: C カテゴリ LC_CTYPE に対応

  • monetary: C カテゴリ LC_MONETARY に対応

  • numeric: C カテゴリ LC_NUMERIC に対応

  • time: C カテゴリ LC_TIME に対応

  • messages: POSIX カテゴリ LC_MESSAGES に対応

さらに 2 つの便利な値を次に示します。

  • none: C カテゴリのいずれにも対応しない

  • all: C のすべてのカテゴリの共用体 LC_ALL に対応

monetary | timeのように、ビットごとの OR とこれらの定数を使用して、カテゴリの任意のグループを表すことができます。

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

ターゲット ロケールに指定されたロケールのファセットを挿入します。

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

パラメーター

source_locale
ターゲット ロケールに挿入されるファセットを含むロケール。

戻り値

メンバー関数は、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 から派生したオブジェクトは構築および破棄できますが、厳密な意味での基底クラスのオブジェクトは構築および破棄できません。 通常は、locale loc(locale::classic(), new _Myfac); のように locale を構築するときに facet から派生したオブジェクト _Myfac を構築します

このような場合、基底クラス facet のコンストラクターには、0 の references 引数が必要です。 オブジェクトが不要になったら、削除されます。 オブジェクトの有効期間に責任を負うまれなケースでのみ、0 以外の 参照 引数を指定します。

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 クラス

このメンバー クラスは、ロケール内でファセットを検索するためのインデックスとして使用される一意のファセット 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
構築されるロケール内での置換後のファセット。

解説

最初のコンストラクターは、グローバル ロケールと一致するようにオブジェクトを初期化します。 2 番目と 3 番目のコンストラクターは、ロケール名 locale_name で一貫した動作になるように、すべてのロケールのカテゴリを初期化します。 残りのコンストラクターは from_locale をコピーしますが、以下の例外に注意してください。

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

は、 Other から置き換えられます 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);

locale(locale_name, all) から、カテゴリ replace_category & new_category が 0 以外であるカテゴリ replace_category に対応するファセットを置き換えます。

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

new_facet が null ポインターではない場合は、from_locale のファセット new_facet を置き換えます (または追加します)。

ロケール名 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!=

2 つのロケールが等しくないかどうかをテストします。

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

パラメーター

right
不等性をテストする一方のロケール。

戻り値

ロケールが同じロケールのコピーでない場合、true のブール値。 ロケールが同じロケールのコピーである場合、false

解説

2 つのロケールが同じロケールである場合、片方がもう片方のコピーである場合、または 2 つが同じ名前を持つ場合、この 2 つのロケールは等しいです。

// 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> ファセットで定義されている辞書式比較規則に従って、2 つの 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
比較する 2 番目の文字列。

戻り値

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

2 つのロケールが等しいかどうかをテストします。

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

パラメーター

right
等しいかどうかをテストする一方のロケール。

戻り値

ロケールが同じロケールのコピーである場合、true のブール値。 ロケールが同じロケールのコピーでない場合、false

解説

2 つのロケールが同じロケールである場合、片方がもう片方のコピーである場合、または 2 つが同じ名前を持つ場合、この 2 つのロケールは等しいです。

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

関連項目

<locale>
コード ページ
ロケール名、言語、および国/地域識別文字列
C++ 標準ライブラリ内のスレッド セーフ