std::text_encoding
来自 cppreference.com
在头文件 <text_encoding> 中定义 |
||
struct text_encoding; |
(自 C++26 起) | |
类 text_encoding
提供了一种识别字符编码的机制。它用于确定 普通字符字面量编码 和当前环境的字符编码。
每个 text_encoding
对象封装一个字符编码方案,由 text_encoding::id
中的枚举器唯一标识,并由一个以空字符结尾的字符串表示相应的名称。可以通过 mib() 和 name() 成员函数分别访问它们。确定对象是否代表翻译或执行环境中实现的字符编码方案是实现定义的。
类 text_encoding
是一个 TriviallyCopyable 类型。它保证其值作为对象存储的一部分分配。不进行动态内存分配。存储的名称限制为最多 max_name_length 个字符,不包括空字符 '\0'。
该类支持已注册和未注册的字符编码。已注册的编码是在 IANA 字符集注册表 中找到的编码,不包括以下字符编码
- NATS-DANO (33)
- NATS-DANO-ADD (34)。
未注册的编码可以用枚举器 id::other 或 id::unknown 和自定义名称表示。
对于已注册的字符编码,该类提供对以下内容的访问权限:
- 主名称:注册表中指定的官方名称。
- 别名:注册表中别名的实现定义超集。
- MIBenum 值:用于识别编码字符编码的唯一标识符。
内容 |
[编辑] 成员类型
表示字符编码的 MIBenum 值 (公共成员枚举) | |
字符编码别名的 视图 (公共成员类) |
[编辑] 成员常量
名称 | 值 |
constexpr std::size_t max_name_length [静态] |
63 (公共静态成员常量) |
[编辑] 数据成员
成员 | 描述 |
std::text_encoding::id mib_ (私有) |
一个 MIBenum 值,默认值为 id::unknown (仅用于说明目的的成员对象*) |
char[max_name_length + 1] name_ (私有) |
一个存储的主名称 (仅用于说明目的的成员对象*) |
[编辑] 成员函数
创建 | |
构造新的 text_encoding 对象(公共成员函数) | |
[静态] |
构造一个新的 text_encoding ,表示 普通字符字面量编码(公共静态成员函数) |
[静态] |
构造一个新的 text_encoding ,表示环境的实现定义字符编码方案(公共静态成员函数) |
观察者 | |
返回当前字符编码的 MIBenum 值 (公共成员函数) | |
返回当前字符编码的主名称 (公共成员函数) | |
返回当前字符编码别名的 视图 (公共成员函数) | |
[静态] |
使用指定的 MIB 值检查环境的字符编码方案 (公共静态成员函数) |
帮助程序 | |
[静态](私有) |
使用 字符集别名匹配 比较两个别名名称 (仅供说明的静态成员函数*) |
[编辑] 非成员函数
比较两个 text_encoding 对象。(公共成员函数) |
[编辑] 辅助类
对 std::text_encoding 的哈希支持 (类模板特化) |
[编辑] 注释
在处理字符编码时,重要的是要注意,两个不同的注册字符编码的主要名称或别名在使用 字符集别名匹配(如 Unicode 技术标准所述)进行比较时并不等效。
为了方便起见,text_encoding::id
的枚举值作为 text_encoding
的成员引入,可以直接访问。这意味着 text_encoding::ASCII 和 text_encoding::id::ASCII 指的是同一个实体。
建议实现应该将注册的编码视为不可互换。此外,注册编码的主要名称不应用于描述类似但不同的非注册编码,除非有明确的先例支持这样做。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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("In this case, 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 In this case, 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
[编辑] 另请参见
封装文化差异的多态构面集 (类) |