类模板
<codecvt>

std::codecvt_utf16

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

在 UTF-16 编码的多字节序列与它们对应的、固定宽度字符类型Elem(UCS-2 或 UCS-4)的序列之间进行转换。

请注意,如果Elem 是 32 位宽字符类型(例如char32_t),并且MaxCode0x10ffff,则执行的是 UTF-16 与 UTF-32 之间的转换。有关 UTF-16 和 UTF-8 之间的转换,请参见 codecvt_utf8_utf16

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

模板参数

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_utf16codecvt 继承

成员类型定义说明
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-16 转换为固定宽度的等效项,类型为Elem.
do_length返回长度(用于 codecvt::length)。
do_max_length返回代码点的最大长度(以字节为单位)。
do_out从固定宽度的宽字符编码(UCS-2 / UCS-4)转换为 UTF-16。
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_utf16: writing UTF-32 string as UTF-16
#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_utf16<char32_t>);
  std::basic_ofstream<char32_t> ofs ("test.txt");
  ofs.imbue(loc);

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

  return 0;
}

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


另见