std::codecvt_mode
来自 cppreference.cn
定义于头文件 <codecvt> |
||
enum codecvt_mode { consume_header = 4, |
(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 之间转换 (类模板) |