命名空间
变体
操作

std::codecvt_mode

来自 cppreference.com
< cpp‎ | locale
定义于头文件 <codecvt>
enum codecvt_mode {

    consume_header = 4,
    generate_header = 2,
    little_endian = 1

};
(自 C++11 起)
(C++17 中已弃用)
(C++26 中已移除)

方面 std::codecvt_utf8std::codecvt_utf16std::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(零宽度不间断空格)将被读取为字符串内容的第一个字符。

[编辑] 示例

以下示例演示了如何消耗 UTF-8 BOM

#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 之间进行转换
(类模板) [编辑]