std::codecvt_mode

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

    consume_header = 4,
    generate_header = 2,
    little_endian = 1

};
(C++11 起)
(C++17 中弃用)

平面 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 <fstream>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
 
int main()
{
    // 带 BOM 的 UTF-8 数据
    std::ofstream("text.txt") << u8"\ufeffz\u6c34\U0001d10b";
    // 读 UTF8 文件,跳过 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 << c << '\n';
}

输出:

0x7a
0x6c34
0x1d10b

[编辑] 参阅

在字符编码间转换,包含 UTF-8 、 UTF-16 、 UTF-32 之间
(类模板) [编辑]
(C++11)
(C++17 中弃用)
在 UTF-8 与 UCS2/UCS4 间转换
(类模板) [编辑]
(C++11)
(C++17 中弃用)
在 UTF-16 与 UCS2/UCS4 间转换
(类模板) [编辑]
(C++11)
(C++17 中弃用)
在 UTF-8 与 UTF-16 间转换
(类模板) [编辑]