Spec-Zone.ru › C++

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).

Кроме того, для зарегистрированных кодировок символов класс предоставляет доступ к:

  1. Основному имени: официальному имени, указанному в реестре.
  2. Псевдонимам: зависящему от реализации надмножеству псевдонимов из реестра.
  3. Значению 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.

Типы-члены

id
представляет значение MIBenum кодировки символов
(открытое перечисление-член)
aliases_view
view над псевдонимами кодировки символов
(открытый класс-член)

Константа-член

Имя Значение
max_name_length
[static]
63
(открытая статическая константа-член)

Данные-члены

Член Описание
std::text_encoding::id mib_ (закрытый) значение MIBenum со значением id::unknown по умолчанию
(объект-член, используемый только для описания)
char[max_name_length+1] name_ (закрытый) сохранённое основное имя
(объект-член, используемый только для описания)

Функции-члены

Создание
(конструктор)
создаёт новый объект text_encoding
(открытая функция-член)
literal
[static]
создаёт новый text_encoding, представляющий кодировку обычных символьных литералов
(открытая статическая функция-член)
environment
[static]
создаёт новый text_encoding, представляющий зависящую от реализации схему кодирования символов среды выполнения
(открытая статическая функция-член)
Функции доступа
mib
возвращает значение MIBenum текущей кодировки символов
(открытая функция-член)
name
возвращает основное имя текущей кодировки символов
(открытая функция-член)
aliases
возвращает view над псевдонимами текущей кодировки символов
(открытая функция-член)
environment_is
[static]
проверяет схему кодирования символов среды выполнения на соответствие указанному значению MIB
(открытая статическая функция-член)
Вспомогательные функции
comp-name
[static](закрытая)
сравнивает два имени псевдонимов с использованием сопоставления псевдонимов наборов символов
(статическая функция-член, используемая только для описания)

Функции, не являющиеся членами

operator==(std::text_encoding)
(C++26)
сравнивает два объекта text_encoding.
(открытая функция-член)

Вспомогательные классы

std::hash<std::text_encoding>
(C++26)
поддержка хеширования для 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

См. также

locale
набор полиморфных фасетов, инкапсулирующих культурные различия
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/text/text_encoding

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API