std::text_encoding
定义于头文件 <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)。
此外,该类还为注册字符编码提供以下访问权限:
- 主名称:注册表中指定的官方名称。
- 别名:注册表中别名的实现定义超集。
- MIBenum 值:用于标识编码字符编码的唯一标识符。
非注册编码可以用枚举器 id::other 或 id::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::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
[编辑] 参阅
封装文化差异的多态刻面集 (类) |