std::codecvt<InternT,ExternT,StateT>::out, do_out
定义在头文件 <locale> 中 |
||
public: result out( StateT& state, |
(1) | |
protected: virtual result do_out( StateT& state, |
(2) | |
do_out
。codecvt
面定义了转换,则将内部字符从源范围 [
from,
from_end)
转换为外部字符,并将结果放置在从 to 开始的后续位置。转换不超过 from_end - from 个内部字符,并写入不超过 to_end - to 个外部字符。使 from_next 和 to_next 指向成功转换的最后一个元素之后的一个元素。如果此 codecvt
面没有定义转换,则不会转换任何字符。 to_next 设置为等于 to,state 保持不变,并返回 std::codecvt_base::noconv。
do_out(state, from, from + 1, from_next, to, to_end, to_next) 必须返回 ok
,如果
- 此
codecvt
面由 basic_filebuf 使用,并且 - do_out(state, from, from_end, from_next, to, to_end, to_next) 将返回
ok
,其中 from != from_end.
内容 |
[编辑] 返回值
一个类型为 std::codecvt_base::result 的值,指示成功状态如下
ok
|
转换完成 |
partial
|
输出缓冲区空间不足或源缓冲区意外结束 |
error
|
遇到无法转换的字符 |
noconv
|
此面不进行转换,没有写入输出 |
不转换的专门化 std::codecvt<char, char, std::mbstate_t> 始终返回 std::codecvt_base::noconv。
[编辑] 注释
要求 from <= from_end && to <= to_end 以及 state 表示初始移位状态或通过转换序列中的前导字符获得。
虽然 codecvt
支持 N:M 转换(例如,UTF-16 到 UTF-8,其中可能需要两个内部字符才能决定要输出哪些外部字符),但 std::basic_filebuf 只能使用定义了 1:N 转换的 codecvt
面,也就是说,它必须能够在写入文件时一次处理一个内部字符。
在执行 N:M 转换时,此函数可能在使用完所有源字符(from_next == from_end)之后返回 std::codecvt_base::partial。这意味着需要另一个内部字符才能完成转换(例如,当将 UTF-16 转换为 UTF-8 时,如果源缓冲区中的最后一个字符是高代理)。
对 state 的影响是故意未指定的。在标准面中,它用于维护移位状态,就像调用 std::wcsrtombs 时一样,因此它被更新为反映最后一个成功转换的字符之后的移位状态,但用户定义的面可以自由使用它来维护任何其他状态,例如计算遇到的特殊字符的数量。
[编辑] 示例
#include <iostream> #include <locale> #include <string> int main() { std::locale::global(std::locale("en_US.utf8")); auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale()); std::wstring internal = L"z\u00df\u6c34\U0001f34c"; // L"zß水🍌" // note that the following can be done with wstring_convert std::mbstate_t mb{}; // initial shift state std::string external(internal.size() * f.max_length(), '\0'); const wchar_t* from_next; char* to_next; f.out(mb, &internal[0], &internal[internal.size()], from_next, &external[0], &external[external.size()], to_next); // error checking skipped for brevity external.resize(to_next - &external[0]); std::cout << "The string in narrow multibyte encoding: " << external << '\n'; }
输出
The string in narrow multibyte encoding: zß水🍌
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 76 | C++98 | 不清楚是否需要转换 以支持一次取一个内部字符 |
仅当使用时才需要 by basic_filebuf |
[编辑] 另请参阅
[虚] |
从 put 区域将字符写入关联的文件 ( std::basic_filebuf<CharT,Traits> 的虚保护成员函数) |
将宽字符串转换为字节字符串 ( std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> 的公共成员函数) | |
将宽字符串转换为窄多字节字符字符串,给定状态 (函数) | |
[虚] |
将字符串从ExternT 转换为InternT ,例如从文件读取时。(虚拟保护成员函数) |