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).
Кроме того, для зарегистрированных кодировок символов класс предоставляет доступ к:
- Основному имени: официальному имени, указанному в реестре.
- Псевдонимам: зависящему от реализации надмножеству псевдонимов из реестра.
- Значению 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.
Типы-члены
| представляет значение MIBenum кодировки символов (открытое перечисление-член) |
|
view над псевдонимами кодировки символов (открытый класс-член) |
Константа-член
| Имя | Значение |
|---|---|
|
max_name_length
[static] |
63 (открытая статическая константа-член) |
Данные-члены
| Член | Описание |
|---|---|
std::text_encoding::id mib_ (закрытый) | значение MIBenum со значением id::unknown по умолчанию(объект-член, используемый только для описания) |
char[max_name_length+1] name_ (закрытый) | сохранённое основное имя (объект-член, используемый только для описания) |
Функции-члены
Создание |
|
создаёт новый объект text_encoding (открытая функция-член) |
|
|
[static] | создаёт новый text_encoding, представляющий кодировку обычных символьных литералов (открытая статическая функция-член) |
|
[static] | создаёт новый text_encoding, представляющий зависящую от реализации схему кодирования символов среды выполнения (открытая статическая функция-член) |
Функции доступа |
|
| возвращает значение MIBenum текущей кодировки символов (открытая функция-член) |
|
| возвращает основное имя текущей кодировки символов (открытая функция-член) |
|
возвращает view над псевдонимами текущей кодировки символов (открытая функция-член) |
|
|
[static] | проверяет схему кодирования символов среды выполнения на соответствие указанному значению MIB (открытая статическая функция-член) |
Вспомогательные функции |
|
|
[static](закрытая) | сравнивает два имени псевдонимов с использованием сопоставления псевдонимов наборов символов (статическая функция-член, используемая только для описания) |
Функции, не являющиеся членами
|
(C++26) | сравнивает два объекта 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
См. также
| набор полиморфных фасетов, инкапсулирующих культурные различия (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/text/text_encoding