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
(公开静态成员常量)

[编辑] 数据成员

名称 描述
std::text_encoding::id mib_ (私有) MIBenum 值,默认值为 id::unknown
(仅用于阐述的成员对象*)
char[max_name_length + 1] name_ (私有) 存储的主名称
(仅用于阐述的成员对象*)

[编辑] 成员函数

创建
构造新的 text_encoding 对象
(公开成员函数) [编辑]
[静态]
构造代表普通字符字面量编码的新 text_encoding
(公开静态成员函数) [编辑]
[静态]
构造代表执行环境的由实现定义的编码方案的新 text_encoding
(公开静态成员函数) [编辑]
观察器
返回当前字符编码的 MIBenum 值
(公开成员函数) [编辑]
返回当前字符编码的首选名称
(公开成员函数) [编辑]
返回当前字符编码的别名的 view
(公开成员函数) [编辑]
以指定的 MIB 值检查执行环境的字符编码方案
(公开静态成员函数) [编辑]
辅助项
[静态](private)
使用字符集别名匹配规则比较两个别名
(仅用于阐述的静态成员函数*)[编辑]

[编辑] 非成员函数

比较两个 text_encoding 对象
(公开成员函数) [编辑]

[编辑] 辅助类

std::text_encoding 的散列支持
(类模板特化) [编辑]

[编辑] 注解

在处理字符编码时,需要重点注意的是,两个不同的已注册字符编码的主名称和别名,在使用 Unicode 技术标准所述的字符集别名匹配(Charset Alias Matching)进行比较时是不等价的。

为便利起见,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()
{
    // 字面量编码是编译时已知的
    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("字面量编码为 {}", literal_encoding.name());
    std::println("字面量编码的别名有:");
    for (const char* alias_name : literal_encoding.aliases())
        std::println(" + {}", alias_name);
 
    if (env_encoding == locale_encoding)
        std::println("执行环境和本地环境编码相同");
 
    std::println("执行环境编码为 {}", env_encoding.name());
    std::println("执行环境编码的别名有:");
    for (const char* alias_name : env_encoding.aliases())
        std::println(" + {}", alias_name);
}

可能的输出:

字面量编码为 UTF-8
字面量编码的别名有:
 + UTF-8
 + csUTF8
执行环境和本地环境编码相同
执行环境编码为 ANSI_X3.4-1968
执行环境编码的别名有:
 + US-ASCII
 + iso-ir-6
 + ANSI_X3.4-1968
 + ANSI_X3.4-1986
 + ISO_646.irv:1991
 + ISO646-US
 + us
 + IBM367
 + cp367
 + csASCII
 + ASCII

[编辑] 参阅

一组用来封装文化差异的多态刻面的集合
(类) [编辑]