5

cppreference はstd::ctype、従来の「C」ロケールに基づいて文字分類を提供すると述べています。これは、次のようなロケールを作成する場合にも当てはまりますか?

std::locale loc(std::locale("en_US.UTF8"), new std::ctype<char>);

ファセットはloc、「C」ロケールまたは Unicode ロケールに基づいて文字を分類しますか? 前者で分類するのであれば、なぜロケール名を「en_US.UTF8」と指定するのでしょうか?

4

3 に答える 3

2

標準では、最小の「C」ロケールに一致するようにデフォルト構築が必要です。 std::ctype<char>§22.4.1.3.3[facet.ctype.char.statics]/1

static const mask* classic_table() noexcept;

戻り値:table_size「C」ロケールでの文字の分類を表すサイズの配列の最初の要素へのポインター

のコンストラクターに別のテーブルが提供されない限り、分類メンバー関数is()は、の観点からtable()定義されます。classic_table()ctype<char>

これらの要件により適切に一致するように cppreference を更新しました (これも「C」と表示されていstd::ctype<wchar_t>ました) 。

2番目の質問に答えるために、で構築されたロケールは、std::locale loc(std::locale("en_US.UTF8"), new std::ctype<char>);指定したctypeファセット(したがって「C」)を使用してナロー文字を分類しますが、冗長です:プレーンstd::locale("en_US.UTF8")(少なくともGNU実装では)のナロー文字分類は正確です同じ:

#include <iostream>
#include <cassert>
#include <locale>
int main()
{

    std::locale loc1("en_US.UTF8");
    const std::ctype_base::mask* tbl1 =
         std::use_facet<std::ctype<char>>(loc1).table();

    std::locale loc2(std::locale("en_US.UTF8"), new std::ctype<char>);
    const std::ctype_base::mask* tbl2 =
         std::use_facet<std::ctype<char>>(loc2).table();

    for(size_t n = 0; n < 256; ++n)
        assert(tbl1[n] == tbl2[n]);
}
于 2013-07-16T21:45:45.550 に答える