# std::codecvt<InternT,ExternT,State>::length, do_length

< 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` 字符，为至多 `max` 个 `internT` 字符，并返回这种转换会消耗的 `externT` 字符数。如同以对某虚构的 `[to, to+max)` 输出缓冲区执行 do_in(state, from, from_end, from, to, to+max, to) 一般修改 `state` 。

### 返回值

假如以 do_in() 转换直至消耗所有 from_end-from 个字符，或产生 `max` 个 `internT` 字符，或出现转换错误，则会消耗的 `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

### 参阅

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