命名空间
变体
操作

std::codecvt_mode

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

    consume_header = 4,
    generate_header = 2,
    little_endian = 1

};
(since C++11)
(deprecated in C++17)
(removed in C++26)

facet 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 (零宽度非断空格) 将被读取为字符串内容的第一个字符。

[编辑] 示例

以下示例演示了消费 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 之间转换
(类模板) [编辑]