std::codecvt::length, do_length

来自cppreference.com
< cpp‎ | locale‎ | codecvt
定义于头文件 <locale>
public:

int length( StateT& state,
            const ExternT* from,
            const ExternT* from_end,

            std::size_t max ) const;
(1)
protected:

virtual int do_length( StateT& state,
                       const ExternT* from,
                       const ExternT* from_end,

                       std::size_t max ) const;
(2)
1) 公开成员函数,调用最终导出类的成员函数 do_length
2) 给定初始转换状态 state ,试图转换来自 [from, from_end) 所定义的字符数组的 externT 字符,为至多 maxinternT 字符,并返回这种转换会消耗的 externT 字符数。如同以对某虚构的 [to, to+max) 输出缓冲区执行 do_in(state, from, from_end, from, to, to+max, to) 一般修改 state

[编辑] 返回值

假如以 do_in() 转换直至消耗所有 from_end-from 个字符,或产生 maxinternT 字符,或出现转换错误,则会消耗的 externT 字符数。

非转换特化 std::codecvt<char, char, std::mbstate_t> 返回 std::min(max, from_end-from)

[编辑] 示例

#include <locale>
#include <string>
#include <iostream>
 
int main()
{
    // 窄多字节编码
    std::string s = "z\u00df\u6c34\U0001d10b"; // 或 u8"zß水𝄋"
                      // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    std::mbstate_t mb = std::mbstate_t();
    std::cout << "Only the first " <<
              std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(
                    std::locale("en_US.utf8")
              ).length(mb, &s[0], &s[s.size()], 2)
              << " bytes out of " << s.size() << " would be consumed "
                 " to produce the first 2 characters\n";
}

输出:

Only the first 3 bytes out of 10 would be consumed to produce the first 2 characters

[编辑] 参阅

[虚]
从 externT 转换字符串为 internT ,如在从文件读取时
(虚受保护成员函数) [编辑]