Spec-Zone.ru › C++

std::codecvt

Определено в заголовке <locale>
template< 
    class InternT, 
    class ExternT, 
    class StateT
> class codecvt;

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

cpp/locale/codecvt base cpp/locale/locale/facetstd-codecvt-inheritance.svg

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

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

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

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

Типы членов

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

Члены-функции

(конструктор)
создает новый объект codecvt
(публичная функция-член)
out
вызывает do_out
(публичная функция-член)
in
вызывает do_in
(публичная функция-член)
unshift
вызывает do_unshift
(публичная функция-член)
encoding
вызывает do_encoding
(публичная функция-член)
always_noconv
вызывает do_always_noconv
(публичная функция-член)
length
вызывает do_length
(публичная функция-член)
max_length
вызывает do_max_length
(публичная функция-член)

Члены-объекты

static std::locale::id id
id объекта locale
(публичный член-объект)

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

(деструктор)
уничтожает объект codecvt
(защищенная функция-член)
do_out
[virtual]
преобразует строку из InternT в ExternT, например, при записи в файл
(виртуальная защищенная функция-член)
do_in
[virtual]
преобразует строку из ExternT в InternT, например, при чтении из файла
(виртуальная защищенная функция-член)
do_unshift
[virtual]
генерирует последовательность завершающих символов ExternT символов для неполного преобразования
(виртуальная защищенная функция-член)
do_encoding
[virtual]
возвращает количество ExternT символов, необходимых для создания одного InternT символа, если это константа
(виртуальная защищенная функция-член)
do_always_noconv
[virtual]
проверяет, кодирует ли facet тождественное преобразование для всех допустимых значений аргументов
(виртуальная защищенная функция-член)
do_length
[virtual]
вычисляет длину ExternT строки, которая будет использована при преобразовании в предоставленный буфер InternT
(виртуальная защищенная функция-член)
do_max_length
[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

См. также

Преобразование символов
Локально определенные многобайтовые
(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>
codecvt_base
определяет ошибки преобразования символов
(класс)
codecvt_byname
представляет системно-предоставленную std::codecvt для локальной настроенной локали
(шаблон класса)
codecvt_utf8
(C++11)(устарело в C++17)(удалено в C++26)
преобразует между UTF-8 и UCS-2/UCS-4
(шаблон класса)
codecvt_utf16
(C++11)(устарело в C++17)(удалено в C++26)
преобразует между UTF-16 и UCS-2/UCS-4
(шаблон класса)
codecvt_utf8_utf16
(C++11)(устарело в C++17)(удалено в C++26)
преобразует между UTF-8 и UTF-16
(шаблон класса)

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

Spec-Zone.ru

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