std::text_encoding

来自cppreference.com
< cpp‎ | locale
 
 
 
 
在标头 <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::otherid::unknown 和一个自定义名称来代表。

对于已注册字符编码,此类提供对以下各项的访问:

  1. 主名称:注册表中规定的官方名称。
  2. 别名: 注册表中的别名的由实现定义的超集。
  3. MIBenum 值: 用于识别字符编码代码的唯一标识符。

成员类型

呈现字符编码的 MIBenum 值
(公开成员枚举)
对字符编码别名的 view
(公开成员类)

成员常量

名称
constexpr std::size_t max_name_length
[静态]
63
(公开静态成员常量)

成员对象

成员名称 定义
mib_ (private) 类型为 text_encoding::id 的 MIBenum 值,默认值为 id::unknown
(仅用于阐述的成员对象*)
name_ (private) 类型为 char[max_name_length + 1] 的存储名称。
(仅用于阐述的成员对象*)

成员函数

创建
构造新 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

参阅

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