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 ←
codecvt ←
codecvt_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)。因此:
- 成员in 将UTF-8转换为等效的固定宽度字符。
- 成员out 将固定宽度的宽字符编码转换为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的转换状态(公众成员函数) |
字符编码属性:
☞ 虚拟受保护成员函数
类通过其虚保护成员函数定义其功能:
成员函数 |
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!
🍄 另请参阅