类模板
<codecvt>

std::codecvt_utf8

template < class Elem, unsigned long MaxCode = 0x10ffffUL, codecvt_mode Mode = (codecvt_mode)0 >  class codecvt_utf8 : public codecvt <Elem, char, mbstate_t>
转换 UTF-8

在 UTF-8 编码的多字节序列和其等效的固定宽度字符(类型为 Elem,即 UCS-2 或 UCS-4)序列之间进行转换。

请注意,如果 Elem 是一个 32 位宽字符类型(例如 char32_t),并且 MaxCode0x10ffff,则执行的是 UTF-8 和 UTF-32 之间的转换。对于 16 位宽字符类型,此类将仅生成不需要代理(普通 UCS-2)的代码点。如需在 UTF-8 和 UTF-16(两者都是可变宽度编码)之间进行转换,或反之,请参见 codecvt_utf8_utf16

该 facet 使用 Elem 作为其 内部字符类型,并使用char作为其 外部字符类型(编码为 UTF-8)。因此
  • 成员 in 将 UTF-8 转换为其固定宽度的字符等价物。
  • 成员 out 将固定宽度的宽字符编码转换为 UTF-8。

模板参数

Elem
内部字符类型,其成员别名为intern_type。这应是一个宽字符类型wchar_t, char16_tchar32_t.
对于 16 位宽字符,成员 in 的超出基本多文种表的字符转换可能会导致转换错误。
该 facet 的 外部字符类型始终是char.
MaxCode
在不报告转换错误的情况下将被翻译的最大代码点。
Mode
类型为 codecvt_mode 的位掩码值
标签描述
consume_header4可选的初始头部序列(BOM)将被读取,以确定多字节序列 在转换 in 时是big-endian还是little-endian。
generate_header2应生成一个初始头部序列(BOM),以指示多字节序列 在转换 out 时是big-endian还是little-endian。
little_endian1转换 out 时生成的多字节序列应为 little-endian(与默认的 big-endian 相反)。

成员类型

以下别名是codecvt_utf8codecvt 继承

成员类型定义说明
intern_type第一个模板参数 (Elem)内部字符类型(宽字符类型)。
extern_typechar外部字符类型(多字节字符类型)。
state_typembstate_t转换状态类型(参见 mbstate_t)。
resultcodecvt_base::result枚举类型,表示转换操作的结果(参见 codecvt_base::result)。

codecvt 继承的公共成员函数


转换函数:

字符编码属性:

虚保护成员函数

该类通过其虚保护成员函数实现其功能
成员函数,逐个字符打印字符串的内容行为 incodecvt_utf16
do_always_no_conv返回值0(并非所有转换都会产生 noconv 结果)。
do_encoding返回值0(外部编码不是固定宽度的)。
do_in将 UTF-8 转换为类型为Elem.
do_length返回长度(用于 codecvt::length)。
do_max_length返回代码点的最大长度(以字节为单位)。
do_out将固定宽度的宽字符编码(UCS-2 / UCS-4)转换为 UTF-8。
do_unshiftmbstate_t 对象带到初始状态。
(析构函数)释放资源。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// codecvt_utf8: writing UTF-32 string as UTF-8
#include <iostream>
#include <locale>
#include <string>
#include <codecvt>
#include <fstream>

int main ()
{
  std::u32string str ( U"\U00004f60\U0000597d" );  // ni hao (你好)

  std::locale loc (std::locale(), new std::codecvt_utf8<char32_t>);
  std::basic_ofstream<char32_t> ofs ("test.txt");
  ofs.imbue(loc);

  std::cout << "Writing to file (UTF-8)... ";
  ofs << str;
  std::cout << "done!\n";

  return 0;
}

输出
Writing to file (UTF-8)... done!


另见