Namespaces
Variants

std:: codecvt

From cppreference.net
Определено в заголовочном файле <locale>
template <

class InternT,
class ExternT,
class StateT

> class codecvt ;

Шаблон класса std::codecvt инкапсулирует преобразование символьных строк, включая широкие и многобайтовые, из одной кодировки в другую. Все операции файлового ввода-вывода, выполняемые через std:: basic_fstream < CharT > используют аспект std :: codecvt < CharT, char , std:: mbstate_t > локали, установленной в потоке.

cpp/locale/codecvt base cpp/locale/locale/facet std-codecvt-inheritance.svg

Диаграмма наследования

Содержание

Специализации

Стандартная библиотека гарантированно предоставляет следующие специализации (они должны быть реализованы любым объектом локали ):

Определено в заголовке <locale>
std :: codecvt < char , char , std:: mbstate_t > тождественное преобразование
std :: codecvt < char16_t , char , std:: mbstate_t >
(начиная с C++11) (устарело в C++20)
преобразование между UTF-16 и UTF-8
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(начиная с C++20) (устарело)
преобразование между UTF-16 и UTF-8
std :: codecvt < char32_t , char , std:: mbstate_t >
(начиная с C++11) (устарело в C++20)
преобразование между UTF-32 и UTF-8
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(начиная с C++20) (устарело)
преобразование между UTF-32 и UTF-8
std :: codecvt < wchar_t , char , std:: mbstate_t > преобразование между системными нативными широкими и однобайтовыми узкими наборами символов

Вложенные типы

Тип Определение
intern_type InternT
extern_type ExternT
state_type StateT

Члены данных

Участник Описание
std::locale::id id [static] идентификатор аспекта

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

создает новый codecvt фасет
(публичная функция-член)
вызывает do_out
(публичная функция-член)
вызывает do_in
(публичная функция-член)
вызывает do_unshift
(публичная функция-член)
вызывает do_encoding
(публичная функция-член)
вызывает do_always_noconv
(публичная функция-член)
вызывает do_length
(публичная функция-член)
вызывает do_max_length
(публичная функция-член)

Защищенные функции-члены

деструктор для фасета codecvt
(защищенная функция-член)
[virtual]
преобразует строку из InternT в ExternT , например при записи в файл
(виртуальная защищенная функция-член)
[virtual]
преобразует строку из ExternT в InternT , например при чтении из файла
(виртуальная защищенная функция-член)
[virtual]
генерирует последовательность завершающих символов ExternT для неполного преобразования
(виртуальная защищенная функция-член)
[virtual]
возвращает количество символов ExternT , необходимых для создания одного символа InternT , если постоянно
(виртуальная защищенная функция-член)
проверяет, кодирует ли фасет тождественное преобразование для всех допустимых значений аргументов
(виртуальная защищенная функция-член)
[virtual]
вычисляет длину строки ExternT , которая будет использована при преобразовании в заданный буфер InternT
(виртуальная защищенная функция-член)
[virtual]
возвращает максимальное количество символов ExternT , которое может быть преобразовано в один символ InternT
(виртуальная защищенная функция-член)

Унаследовано от std:: codecvt_base

Вложенный тип Определение
enum result { ok, partial, error, noconv } ; Неограниченный тип перечисления
Константа перечисления Определение
ok преобразование завершено без ошибок
partial преобразованы не все исходные символы
error встречен недопустимый символ
noconv преобразование не требуется, входной и выходной типы совпадают

Пример

Следующие примеры читают UTF-8 файл с использованием локали, которая реализует преобразование UTF-8 в codecvt < wchar_t , char , std:: mbstate_t > и преобразует UTF-8 строку в UTF-16 с использованием одной из стандартных специализаций std::codecvt .

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
    std::ofstream("text.txt") << data;
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

Вывод:

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Исправленное поведение
LWG 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t > и
std :: codecvt < char32_t , char8_t, std:: mbstate_t > не зависят от локали
объявлены устаревшими

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

Преобразования символов
многобайтовые, определенные локализацией
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (с DR488 из C11)

codecvt < char16_t , char ,mbstate_t >
codecvt_utf8_utf16 < char16_t >
codecvt_utf8_utf16 < char32_t >
codecvt_utf8_utf16 < wchar_t >

Н/П
UCS-2 c16rtomb (без DR488 из C11) codecvt_utf8 < char16_t > codecvt_utf16 < char16_t >
UTF-32

mbrtoc32 / c32rtomb

codecvt < char32_t , char ,mbstate_t >
codecvt_utf8 < char32_t >

codecvt_utf16 < char32_t >

системный wchar_t :

UTF-32 (не-Windows)
UCS-2 (Windows)

mbsrtowcs / wcsrtombs
use_facet < codecvt
< wchar_t , char ,mbstate_t >> ( locale )

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
определяет ошибки преобразования символов
(класс)
представляет предоставляемый системой std::codecvt для именованной локали
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-8 и UCS-2/UCS-4
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-16 и UCS-2/UCS-4
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-8 и UTF-16
(шаблон класса)