std::codecvt_utf16
Определено в заголовке <codecvt> | ||
|---|---|---|
template<
class Elem,
unsigned long Maxcode = 0x10ffff,
std::codecvt_mode Mode = (std::codecvt_mode)0 >
class codecvt_utf16
: public std::codecvt<Elem, char, std::mbstate_t>;
| (с C++11) (устарело в C++17) (удалено в C++26) |
std::codecvt_utf16 является std::codecvt фасетом, который инкапсулирует преобразование между строкой байтов, закодированной в UTF-16, и строкой символов UCS-2 или UTF-32 (в зависимости от типа Elem). Этот std::codecvt фасет можно использовать для чтения и записи файлов UTF-16 в двоичном режиме.
| UCS-2 — это тот же код, что и UTF-16, за исключением того, что он кодирует скалярные значения только в диапазоне U+0000-U+FFFF (Основная многоязычная плоскость). | (с C++23) |
Шаблонные параметры
| Elem | - | либо char16_t, char32_t, или wchar_t |
| Maxcode | - | максимальное значение Elem , которое этот фасет будет читать или писать без ошибок |
| Mode | - | константа типа std::codecvt_mode |
Члены-функции
| (конструктор) | создаёт новый codecvt_utf16 фасет (публичная функция-член) |
| (деструктор) | уничтожает codecvt_utf16 фасет (публичная функция-член) |
std::codecvt_utf16::codecvt_utf16
explicit codecvt_utf16( std::size_t refs = 0 ); |
Создаёт новый std::codecvt_utf16 фасет, передаёт начальный счётчик ссылок refs в базовый класс.
Параметры
| refs | - | количество ссылок, связанных с фасетом |
std::codecvt_utf16::~codecvt_utf16
~codecvt_utf16(); |
Уничтожает фасет. В отличие от управляемых локалью фасетов, деструктор этого фасета является публичным.
Унаследованно от std::codecvt
Типы членов
| Тип члена | Определение |
|---|---|
intern_type | internT |
extern_type | externT |
state_type | stateT |
Члены-объекты
| Название члена | Тип |
|---|---|
id (статический) | std::locale::id |
Функции-члены
вызывает 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>) |
Защищённые функции-члены
| [виртуальный] | преобразует строку из InternT в ExternT, например, при записи в файл (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | преобразует строку из ExternT в InternT, например, при чтении из файла (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | генерирует последовательность завершающих символов ExternT символов для неполного преобразования (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | возвращает количество ExternT символов, необходимых для создания одного InternT символа, если константа (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | проверяет, кодирует ли фасет тождественное преобразование для всех допустимых значений аргументов (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | вычисляет длину строки ExternT , которая будет использована для преобразования в заданный буфер InternT (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
| [виртуальный] | возвращает максимальное количество ExternT символов, которые можно преобразовать в один InternT символ (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
Унаследованно от std::codecvt_base
| Тип члена | Определение |
|---|---|
| enum result { ok, partial, error, noconv }; | Тип нескопированной перечисления |
| Константа перечисления | Определение |
|---|---|
ok | преобразование выполнено без ошибок |
partial | не все символы источника были преобразованы |
error | встречен недопустимый символ |
noconv | преобразование не требуется, типы входных и выходных данных одинаковы |
Примечания
Хотя стандарт требует, чтобы этот фасет работал с UCS-2, когда размер Elem составляет 16 бит, некоторые реализации вместо этого используют UTF-16, что делает это не преобразующей локалью. Термин «UCS-2» был устаревшим и удалён из ISO 10646.
Начиная с C++23, UCS-2 больше не относится к его первоначальному определению. Он становится синонимом UTF-16, но с меньшим диапазоном кодирования.
Пример
Следующий пример демонстрирует декодирование файла UTF-16le на системе с 32-битным wchar_t. На системе с 16-битным wchar_t декодирование третьего символа завершится ошибкой, потому что std::codecvt_utf16<char16_t> производит UCS-2, а не UTF-16.
#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
void prepare_file()
{
// UTF-16le data (if host system is little-endian)
char16_t utf16le[4] = {0x007a, // latin small letter 'z' U+007a
0x6c34, // CJK ideograph "water" U+6c34
0xd834, 0xdd0b}; // musical sign segno U+1d10b
// store in a file
std::ofstream fout("text.txt");
fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le);
}
int main()
{
prepare_file();
// open as a byte stream
std::wifstream fin("text.txt", std::ios::binary);
// apply facet
fin.imbue(std::locale(fin.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
wchar_t c = 0;
for (std::cout << std::showbase << std::hex; fin.get(c);
std::cout << static_cast<std::wint_t>(c) << '\n');
}Вывод:
0x7a 0x6c34 0x1d10b
См. также
| Преобразования символов | Определённые локалью многобайтовые (UTF-8, GB18030) | UTF-8 | UTF-16 |
|---|---|---|---|
| UTF-16 |
mbrtoc16 / c16rtomb (с DR488 C11) |
| Нет данных |
| UCS-2 |
c16rtomb (без DR488 C11) |
codecvt_utf8<char16_t> |
codecvt_utf16<char16_t> |
| UTF-32 |
|
|
|
| Системный wchar_t: UTF-32 (не Windows) |
|
codecvt_utf8<wchar_t> |
codecvt_utf16<wchar_t> |
| Преобразует между кодировками символов, включая UTF-8, UTF-16, UTF-32 (шаблон класса) |
|
|
(C++11)(устарело в C++17)(удалено в C++26) | метки для изменения поведения стандартных аспектов codecvt (перечисление) |
|
(C++11)(устарело в C++17)(удалено в C++26) | преобразует между UTF-8 и UCS-2/UCS-4 (шаблон класса) |
|
(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_utf16