Namespaces
Variants

std:: codecvt_mode

From cppreference.net
Определено в заголовочном файле <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 с обратным порядком байтов
0xff 0xfe UTF-16 с прямым порядком байтов
0xef 0xbb 0xbf UTF-8 (не влияет на порядок байтов)

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

Пример

Следующий пример демонстрирует обработку BOM 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

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

преобразует между кодировками символов, включая UTF-8, UTF-16, UTF-32
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-8 и UCS-2/UCS-4
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-16 и UCS-2/UCS-4
(шаблон класса)
(C++11) (устарел в C++17) (удален в C++26)
преобразует между UTF-8 и UTF-16
(шаблон класса)