Namespaces
Variants

std:: text_encoding

From cppreference.net
ヘッダーで定義 <text_encoding>
struct text_encoding ;
(C++26以降)

text_encoding クラスは、文字エンコーディングを識別するための仕組みを提供します。これは、コンパイル時に翻訳環境の 通常文字リテラルエンコーディング を、また実行時に実行環境の文字エンコーディングを決定するために使用されます。

text_encoding オブジェクトは 文字エンコーディング方式 をカプセル化しており、 text_encoding::id の列挙子と、対応するヌル終端バイト文字列で表現される名前によって一意に識別されます。これらはそれぞれ mib() および name() メンバー関数を通じてアクセスできます。オブジェクトが翻訳環境または実行環境で実装された文字エンコーディング方式を表現するかどうかの判定は実装定義です。

text_encoding クラスは TriviallyCopyable 型です。文字エンコーディング方式に対応する名前を表す配列オブジェクトは、 text_encoding オブジェクト自体に内包されています 。格納される名前は、ナル文字 ' \0 ' を除いて最大 max_name_length 文字に制限されています。

このクラスは登録済みおよび未登録の文字エンコーディングの両方をサポートします。登録済みエンコーディングとは、 IANA文字セットレジストリ で確認できるもののうち、以下の文字エンコーディングを除いたものを指します:

  • NATS-DANO (33)
  • NATS-DANO-ADD (34)

さらに、このクラスは登録された文字エンコーディングに対して以下の機能へのアクセスを提供します:

  1. プライマリ名 : レジストリで指定された公式名称。
  2. エイリアス : レジストリからのエイリアスの実装定義による上位集合。
  3. MIBenum値 : 符号化文字エンコーディングを識別するための一意の識別子。

登録されていないエンコーディングは、列挙子 id :: other または id :: unknown とカスタム名で表現できます。

MIBenum値が id :: other でも id :: unknown でもない text_encoding オブジェクト e は、以下の不変条件を維持します:

  • * e. name ( ) ! = ' \0 ' true であり、かつ
  • e. mib ( ) == std:: text_encoding ( e. name ( ) ) . mib ( ) true である。

目次

メンバー型

文字エンコーディングのMIBenum値を表す
(公開メンバ列挙型)
文字エンコーディングのエイリアスに対する view ビュー
(公開メンバクラス)

メンバー定数

名前
constexpr std:: size_t max_name_length
[static]
63
(public static member constant)

データメンバ

メンバー 説明
std :: text_encoding :: id mib_ (private) デフォルト値として id :: unknown を持つMIBenum値
( 説明専用メンバーオブジェクト* )
char [ max_name_length + 1 ] name_ (private) 格納されたプライマリ名
( 説明専用メンバーオブジェクト* )

メンバー関数

Creation
新しい text_encoding オブジェクトを構築する
(public member function)
[static]
通常の文字リテラルエンコーディング を表す新しい text_encoding を構築する
(public static member function)
[static]
実行環境の実装定義の文字エンコーディングスキームを表す新しい text_encoding を構築する
(public static member function)
Observers
現在の文字エンコーディングのMIBenum値を返す
(public member function)
現在の文字エンコーディングのプライマリ名を返す
(public member function)
現在の文字エンコーディングのエイリアスの view を返す
(public member function)
指定されたMIB値で実行環境の文字エンコーディングスキームをチェックする
(public static member function)
Helpers
[static] (private)
Charset Alias Matching を使用して2つのエイリアス名を比較する
( exposition-only static member function* )

非メンバー関数

2つの text_encoding オブジェクトを比較する。
(public member function)

ヘルパークラス

std::text_encoding のハッシュサポート
(クラステンプレートの特殊化)

注記

文字エンコーディングを扱う際に重要な点として、Unicode技術標準で規定されている Charset Alias Matching を使用して比較した場合、2つの異なる登録済み文字エンコーディングの主要名またはエイリアスは等価ではありません。

利便性のため、 text_encoding::id の列挙子は text_encoding のメンバーとして導入されており、直接アクセスできます。これは、 text_encoding :: ASCII text_encoding :: id :: ASCII が同じエンティティを参照することを意味します。

実装では、登録されたエンコーディングを互換性のないものとして扱うことが推奨されます。 さらに、登録されたエンコーディングの主要名は、明確な前例がない限り、類似しているが異なる非登録エンコーディングを記述するために使用すべきではありません。

機能テスト マクロ 標準 機能
__cpp_lib_text_encoding 202306L (C++26) std::text_encoding

#include <locale>
#include <print>
#include <text_encoding>
int main()
{
    // リテラルエンコーディングはコンパイル時に既知
    constexpr std::text_encoding literal_encoding = std::text_encoding::literal();
    // リテラルエンコーディングのチェック
    static_assert(literal_encoding.mib() != std::text_encoding::other &&
                  literal_encoding.mib() != std::text_encoding::unknown);
    // 環境エンコーディングは実行時にのみ既知
    std::text_encoding env_encoding = std::text_encoding::environment();
    // デフォルトロケールの関連エンコーディング
    std::text_encoding locale_encoding = std::locale("").encoding();
    std::println("The literal encoding is {}", literal_encoding.name());
    std::println("The aliases of literal encoding:");
    for (const char* alias_name : literal_encoding.aliases())
        std::println(" -> {}", alias_name);
    if (env_encoding == locale_encoding)
        std::println("Both environment and locale encodings are the same");
    std::println("The environment encoding is {}", env_encoding.name());
    std::println("The aliases of environment encoding:");
    for (const char* alias_name : env_encoding.aliases())
        std::println(" -> {}", alias_name);
}

出力例:

The literal encoding is UTF-8
The aliases of literal encoding:
 -> UTF-8
 -> csUTF8
Both environment and locale encodings are the same
The environment encoding is ANSI_X3.4-1968
The aliases of environment encoding:
 -> US-ASCII
 -> iso-ir-6
 -> ANSI_X3.4-1968
 -> ANSI_X3.4-1986
 -> ISO_646.irv:1991
 -> ISO646-US
 -> us
 -> IBM367
 -> cp367
 -> csASCII
 -> ASCII

関連項目

文化的差異をカプセル化する多相的なファセットの集合
(クラス)