Namespaces
Variants

std:: text_encoding

From cppreference.net
Определено в заголовочном файле <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 ' истинно, и
  • e. mib ( ) == std:: text_encoding ( e. name ( ) ) . mib ( ) истинно.

Содержание

Типы членов

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

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

Название Значение
constexpr std:: size_t max_name_length
[static]
63
(публичная статическая константа-член)

Члены данных

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

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

Создание
создает новый объект text_encoding
(public member function)
[static]
создает новый text_encoding представляющий кодировку обычных символьных литералов
(public static member function)
[static]
создает новый text_encoding представляющий определенную реализацией схему кодировки символов среды выполнения
(public static member function)
Наблюдатели
возвращает значение MIBenum текущей кодировки символов
(public member function)
возвращает основное имя текущей кодировки символов
(public member function)
возвращает view над псевдонимами текущей кодировки символов
(public member function)
проверяет схему кодировки символов среды выполнения с указанным значением MIB
(public static member function)
Вспомогательные функции
[static] (private)
сравнивает два имени псевдонима используя Charset Alias Matching
( exposition-only static member function* )

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

сравнивает два text_encoding объекта.
(публичная функция-член)

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

поддержка хеширования для std::text_encoding
(специализация шаблона класса)

Примечания

При работе с кодировками символов важно отметить, что основные названия или псевдонимы двух различных зарегистрированных кодировок символов не являются эквивалентными при сравнении с использованием Charset Alias Matching , как описано в Техническом стандарте Юникода.

Для удобства перечислители 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()
{
    // кодировка литералов известна на этапе компиляции
    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("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

Смотрите также

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