Spec-Zone.ru › C++

std::codecvt_mode

Определено в заголовке <codecvt>
enum codecvt_mode {
    consume_header = 4,
    generate_header = 2,
    little_endian = 1
};
(с C++11)
(устарело в C++17)
(удалено в C++26)

Фасеты std::codecvt_utf8, std::codecvt_utf16, и std::codecvt_utf8_utf16 принимают необязательное значение типа std::codecvt_mode в качестве шаблонного аргумента, который задаёт необязательные особенности преобразования строковых данных Unicode.

Постоянные значения

Определено в заголовке <locale>
Значение Значение
little_endian предполагает, что входные данные в формате little-endian (применимо только к вводу UTF-16, по умолчанию используется big-endian)
consume_header потребляет метку порядка байтов, если она присутствует в начале входной последовательности, и (в случае UTF-16) использует порядок байтов, указанный в ней, для декодирования остальной части входных данных
generate_header выводит метку порядка байтов в начале выходной последовательности

Распознаваемые метки порядка байтов:

0xfe 0xff UTF-16 big-endian
0xff 0xfe UTF-16 little-endian
0xef 0xbb 0xbf UTF-8 (без влияния на порядок байтов)

Если std::consume_header не выбрано при чтении файла, начинающегося с метки порядка байтов, символ Unicode U+FEFF (пробел нулевой ширины) будет считаться первым символом содержимого строки.

Пример

Следующий пример демонстрирует потребление метки порядка байтов UTF-8:

#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
 
int main()
{
    // UTF-8 data with BOM
    std::ofstream{"text.txt"} << "\ufeffz\u6c34\U0001d10b";
 
    // read the UTF-8 file, skipping the BOM
    std::wifstream fin{"text.txt"};
    fin.imbue(std::locale(fin.getloc(),
                          new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>));
 
    for (wchar_t c; fin.get(c);)
        std::cout << std::hex << std::showbase << (std::wint_t)c << '\n';
}

Вывод:

0x7a
0x6c34
0x1d10b

См. также

codecvt
преобразует между кодировками символов, включая UTF-8, UTF-16, UTF-32
(шаблон класса)
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_mode

Spec-Zone.ru

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