std::text_encoding
| ヘッダー <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).
さらに、このクラスは登録済みの文字エンコーディングに対して以下へのアクセスを提供します。
- プライマリ名:レジストリで指定されている公式名。
- エイリアス:レジストリのエイリアスの実装定義のスーパーセット。
- 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値を表す (公開メンバ enum) | |
文字エンコーディングのエイリアスに対するview(公開メンバクラス) |
[編集] メンバ定数
| 名前 | 値 |
| constexpr std::size_t max_name_length [static] |
63 (公開静的メンバ定数) |
[編集] データメンバ
| メンバ | 説明 |
std::text_encoding::id mib_ (非公開) |
MIBenum値、デフォルト値はid::unknown (説明用のメンバオブジェクト*) |
char[max_name_length + 1] name_ (非公開) |
格納されているプライマリ名 (説明用のメンバオブジェクト*) |
[編集] メンバ関数
生成 | |
新しいtext_encodingオブジェクトを構築する(公開メンバ関数) | |
| [static] |
通常の文字リテラルエンコーディングを表す新しいtext_encodingを構築する(公開静的メンバ関数) |
| [static] |
実行環境の実装定義の文字エンコーディングスキームを表す新しいtext_encodingを構築する(公開静的メンバ関数) |
監視 | |
| 現在の文字エンコーディングのMIBenum値を返す (公開メンバ関数) | |
| 現在の文字エンコーディングのプライマリ名を返す (公開メンバ関数) | |
現在の文字エンコーディングのエイリアスに対するviewを返す(公開メンバ関数) | |
| [static] |
実行環境の文字エンコーディングスキームが指定されたMIB値であるかを確認する (公開静的メンバ関数) |
ヘルパー | |
| [static](非公開) |
Charset Alias Matchingを用いて2つのエイリアス名を比較する (説明専用の静的メンバ関数*) |
[編集] 非メンバ関数
2つのtext_encodingオブジェクトを比較する。(公開メンバ関数) |
[編集] ヘルパークラス
| std::text_encodingのハッシュサポート (クラステンプレートの特殊化) |
[編集] ノート
文字エンコーディングを扱う際、2つの異なる登録済み文字エンコーディングのプライマリ名やエイリアスは、Unicode技術標準で記述されているCharset Alias Matchingを用いて比較した場合に等価ではないことに注意することが重要です。
便宜上、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() { // literal encoding is known at compile-time constexpr std::text_encoding literal_encoding = std::text_encoding::literal(); // check for literal encoding static_assert(literal_encoding.mib() != std::text_encoding::other && literal_encoding.mib() != std::text_encoding::unknown); // environment encoding is only known at runtime std::text_encoding env_encoding = std::text_encoding::environment(); // associated encoding of the default locale 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
[編集] 関連項目
| 文化的な違いをカプセル化するポリモーフィックなファセットのセット (クラス) |