Namespaces
Variants

std:: codecvt_byname

From cppreference.net
Определено в заголовочном файле <locale>
template < class InternT, class ExternT, class State >
class codecvt_byname : public std:: codecvt < InternT, ExternT, State > ;

std::codecvt_byname является фасетом std::codecvt , который инкапсулирует правила преобразования многобайтовых/широких символов для локали, указанной при его создании.

Содержание

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

Стандартная библиотека гарантированно предоставляет следующие специализации:

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

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

(constructor)
создает новый объект codecvt_byname
(публичная функция-член)
(destructor)
уничтожает объект codecvt_byname
(защищенная функция-член)

std::codecvt_byname:: codecvt_byname

explicit codecvt_byname ( const char * name, std:: size_t refs = 0 ) ;
explicit codecvt_byname ( const std:: string & name, std:: size_t refs = 0 ) ;
(начиная с C++11)

Создает новый фасет std::codecvt_byname для локали с именем name .

refs используется для управления ресурсами: если refs == 0 , реализация уничтожает фасет, когда уничтожается последний объект std::locale , который его содержит. В противном случае объект не уничтожается.

Параметры

name - имя локали
refs - количество ссылок, связывающих фасет

std::codecvt_byname:: ~codecvt_byname

protected :
~codecvt_byname ( ) ;

Уничтожает фацет.

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

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

Тип Определение
intern_type internT
extern_type externT
state_type stateT

Члены данных

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

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

вызывает do_out
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_in
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_unshift
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_encoding
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_always_noconv
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_length
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )
вызывает do_max_length
(публичная функция-член std::codecvt<InternT,ExternT,StateT> )

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

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

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

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

Пример

Этот пример демонстрирует чтение файла в кодировке GB18030 с использованием аспекта codecvt из локали с поддержкой GB18030.

#include <fstream>
#include <iostream>
#include <locale>
#include <string>
int main()
{
    // GB18030 narrow multibyte encoding
    std::ofstream("text.txt") << "\x7a"              // letter 'z', U+007a
                                 "\x81\x30\x89\x38"  // letter 'ß', U+00df
                                 "\xcb\xae"          // CJK ideogram '水' (water), U+6c34
                                 "\x94\x32\xbc\x35"; // musical sign '𝄋' (segno), U+1d10b
    std::wifstream fin("text.txt");
    fin.imbue(std::locale(fin.getloc(),
              new std::codecvt_byname<wchar_t, char, std::mbstate_t>("zh_CN.gb18030")));
    for (wchar_t c; fin.get(c);)
        std::cout << std::hex << std::showbase << static_cast<unsigned>(c) << '\n';
}

Возможный вывод:

0x7a
0xdf
0x6c34
0x1d10b

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

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

DR Applied to Behavior as published Correct behavior
LWG 21 C++98 стандартная библиотека не должна была предоставлять
никакие специализации std::codecvt_byname
требуются две специализации

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

преобразует между кодировками символов, включая UTF-8, UTF-16, UTF-32
(шаблон класса)