std:: codecvt_byname
|
Определено в заголовочном файле
<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>
)
|
|
[virtual]
|
проверяет, кодирует ли фасет тождественное преобразование для всех допустимых значений аргументов
(виртуальная защищенная функция-член
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
(шаблон класса) |