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 | считать, что входные данные имеют порядок байтов от младшего к старшему (применяется только к входным данным UTF-16; по умолчанию используется порядок от старшего к младшему) |
consume_header | обрабатывать маркер порядка байтов, если он присутствует в начале входной последовательности, и (в случае UTF-16) использовать указанный им порядок байтов для декодирования оставшейся части входных данных |
generate_header | выводить маркер порядка байтов в начале выходной последовательности |
Распознаются следующие маркеры порядка байтов:
0xfe 0xff | UTF-16, порядок байтов от старшего к младшему |
0xff 0xfe | UTF-16, порядок байтов от младшего к старшему |
0xef 0xbb 0xbf | UTF-8 (не влияет на порядок байтов) |
Если при чтении файла, начинающегося с маркера порядка байтов, не выбран параметр std::consume_header, символ Unicode 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 (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/codecvt_mode