名稱空間
變體
操作

std::text_encoding

來自 cppreference.com
< cpp‎ | text
定義於標頭檔案 <text_encoding>
struct text_encoding;
(C++26 起)

text_encoding 類提供了一種識別字符編碼的機制。它用於在編譯時確定翻譯環境的普通字元字面量編碼,以及在執行時確定執行環境的字元編碼。

每個 text_encoding 物件都封裝了一個字元編碼方案,該方案透過 text_encoding::id 中的列舉器和相應的以空位元組串表示的名稱唯一標識。這些可以透過成員函式 mib()name() 分別訪問。物件是否表示在翻譯或執行環境中實現的字元編碼方案是實現定義的。

text_encoding 類是一個TriviallyCopyable 型別。表示字元編碼方案相應名稱的陣列物件巢狀在 text_encoding 物件本身中。儲存的名稱的最大長度為 max_name_length 個字元,不包括空字元 '\0'

該類支援註冊和非註冊字元編碼。註冊編碼是指 IANA 字元集註冊表 中找到的編碼,但不包括以下字元編碼:

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

此外,該類還為註冊字元編碼提供以下訪問許可權:

  1. 主名稱:登錄檔中指定的官方名稱。
  2. 別名:登錄檔中別名的實現定義超集。
  3. MIBenum 值:用於標識編碼字元編碼的唯一識別符號。

非註冊編碼可以用列舉器 id::otherid::unknown 和自定義名稱表示。

一個 text_encoding 物件 e,其 MIBenum 值既不是 id::other 也不是 id::unknown,保持以下不變式:

  • *e.name() != '\0'true,以及
  • e.mib() == std::text_encoding(e.name()).mib()true

目錄

[編輯] 成員型別

表示字元編碼的 MIBenum 值
(公共成員列舉)[編輯]
字元編碼別名的view
(公共成員類) [編輯]

[編輯] 成員常量

名稱
constexpr std::size_t max_name_length
[靜態]
63
(public static 成員常量)

[編輯] 資料成員

成員 描述
std::text_encoding::id mib_ (私有) 一個 MIBenum 值,預設值為 id::unknown
(僅用於闡釋的成員物件*)
char[max_name_length + 1] name_ (私有) 儲存的主名稱
(僅用於闡釋的成員物件*)

[編輯] 成員函式

建立
構造新的 text_encoding 物件
(公共成員函式) [編輯]
[靜態]
構造一個表示普通字元字面量編碼的新的 text_encoding
(公共靜態成員函式) [編輯]
[靜態]
構造一個表示執行環境的實現定義的字元編碼方案的新的 text_encoding
(公共靜態成員函式) [編輯]
觀察器
返回當前字元編碼的 MIBenum 值
(公共成員函式) [編輯]
返回當前字元編碼的主名稱
(公共成員函式) [編輯]
返回當前字元編碼別名的view
(公共成員函式) [編輯]
使用指定的 MIB 值檢查執行環境的字元編碼方案
(公共靜態成員函式) [編輯]
輔助函式
[靜態](私有)
使用 字元集別名匹配 比較兩個別名
(僅用於說明的靜態成員函式*)[編輯]

[編輯] 非成員函式

比較兩個 text_encoding 物件。
(公共成員函式) [編輯]

[編輯] 輔助類

std::text_encoding 的雜湊支援
(類模板特化) [編輯]

[編輯] 注意

在處理字元編碼時,需要注意的是,當使用 Unicode 技術標準描述的 字元集別名匹配 進行比較時,兩個不同的註冊字元編碼的主名稱或別名是不等效的。

為方便起見,text_encoding::id 的列舉器被引入為 text_encoding 的成員,可以直接訪問。這意味著 text_encoding::ASCIItext_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

[編輯] 參閱

封裝文化差異的多型刻面集
(類) [編輯]