Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

codecvt_utf8

类模板;  <codecvt>
template < class Elem, unsigned long MaxCode = 0x10ffffUL, codecvt_mode Mode = (codecvt_mode)0 >
  class codecvt_utf8 : public codecvt <Elem, char, mbstate_t>

转换为utf-8
locale::facet codecvtcodecvt_utf8
codecvt_base

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

注意,如果Elem是一个32位宽度的字符类型(例如char32_t),而MaxCode是0x10ffff, 那么执行的转换是在UTF-8和UTF-32之间进行的。对于16位宽度的字符类型, 该类只生成不需要代理的目标编码(普通的旧UCS-2)。要将UTF-8转换为UTF-16(都是变宽编码)或反过来, 请参阅codecvt_utf8_utf16。 平台使用Elem作为其内部字符类型,使用char作为其外部字符类型(编码为UTF-8)。因此:

☲  模板参数


Elem
内部字符类型,成员intern_type的别名。这应该是一个宽字符类型:wchar_t、char16_t或char32_t。
对于16位宽的字符,基本多语言平台以外的字符的conversions in可能会导致转换错误。
外部字符类型在这个平台中总是char。

MaxCode
将被转换而不报告转换错误的最大目标编码。
Mode
codecvt_mode类型的位掩码值:
标签 说明
consume_header 4 读取可选的初始头序列(BOM)以确定转换的多字节序列是大端序还是小端序。
generate_header 2 生成一个初始头序列(BOM)来指示转换出来的多字节序列是大端序还是小端序。
little_endian 1 输出转换时生成的多字节序列应该是小端序(与默认的大端序相反)。

☞ 成员类型



以下是codecvt_utf8的成员类型的别名,从codecvt继承而来:
成员类型 定义 注释
intern_type 第一个模板参数(Elem) 内部字符类型(宽字符类型)。
extern_type char 外部字符类型(多字节字符类型)。
state_type mbstate_t 转换状态类型(参见mbstate_t)。
result codecvt_base::result 具有转换操作的结果的枚举类型(请参阅codecvt_base::result)。

☞ 从codecvt继承的公共成员函数



(constructor) codecvt 构造函数 (公众成员函数)
in 将UTF-8转换为等效的固定宽度字符(公众成员函数)
out 将固定宽度的宽字符编码转换为UTF-8(公众成员函数)
unshift unshift的转换状态(公众成员函数)

字符编码属性:
always_noconv 返回noconv特征(公共静态成员函数)
encoding 返回编码宽度(公共静态成员函数)
length 返回转换后序列的长度(公共静态成员函数)
max_length 返回一个字符的最大长度(公共静态成员函数)

☞ 虚拟受保护成员函数



类通过其虚保护成员函数定义其功能:
成员函数 codecvt_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_unshift 使mbstate_t对象处于初始状态。
(destructor) 释放资源

☣  示例



// 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!

🍄  另请参阅



codecvt 编码转换平台(类模板)
codecvt_utf16 转换为utf - 16 (类模板)
codecvt_utf8_utf16 UTF-8和UTF-16之间的转换 (类模板)

联系我们 免责声明 关于CandCplus 网站地图