std::
codecvt_utf8_utf16
类模板; <codecvt>
template < class Elem, unsigned long MaxCode = 0x10ffffUL, codecvt_mode Mode = (codecvt_mode)0 >
class codecvt_utf8_utf16 : public codecvt <Elem, char, mbstate_t>
UTF-8和UTF-16之间的转换
locale::facet ←
codecvt ←
codecvt_16
codecvt_base
UTF-8和UTF-16编码之间的多字节序的转换。
在UTF-8编码的多字节序列和Elem类型的等效固定宽字符序列(UCS-2或UCS-4)之间进行转换。
平台使用Elem作为其内部字符类型(编码为UTF-16),使用char作为其外部字符类型(编码为UTF-8)。因此:
- 成员in 将UTF-8转换为UTF-16
- 成员out 将UTF-16转换为UTF-8。
☲ 模板参数
-
Elem
-
内部字符类型,成员intern_type的别名。这应该是一个宽字符类型:wchar_t、char16_t或char32_t。
对于32位宽的字符,字符的转换导致每个宽字符存储一个UTF-16代码单元(作为32位值)。
外部字符类型在这个平台中总是char。
-
MaxCode
-
将被转换而不报告转换错误的最大目标编码。
-
Mode
-
codecvt_mode类型的位掩码值:
标签 |
值 |
说明 |
consume_header |
4 |
读取可选的初始头序列(BOM)以确定转换的多字节序列是大端序还是小端序。 |
generate_header |
2 |
生成一个初始头序列(BOM)来指示转换出来的多字节序列是大端序还是小端序。 |
little_endian |
1 |
输出转换时生成的多字节序列应该是小端序(与默认的大端序相反)。 |
☞ 成员类型
以下是codecvt_utf8_utf16的成员类型的别名,从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转换为UTF-16。 |
do_length |
返回长度(对于codecvt::length)。 |
do_max_length |
返回目标编码的最大长度(以字节为单位)。 |
do_out |
将UTF-16转换为UTF-8。 |
do_unshift |
使mbstate_t对象处于初始状态。 |
(destructor) |
释放资源 |
☣ 示例
// codecvt_utf8_utf16 example
#include <iostream>
#include <locale>
#include <string>
#include <codecvt>
int main ()
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> conversion;
std::string mbs = conversion.to_bytes( u"\u4f60\u597d" ); // ni hao (你好)
// print out hex value of each byte:
std::cout << std::hex;
for (int i=0; i<mbs.length(); ++i)
std::cout << int(unsigned char(mbs[i])) << ' ';
std::cout << '\n';
return 0;
}
|
输出:
e4 bd a0 e5 a5 bd
🍄 另请参阅