| Localization library | |||||||||||||||||||||||||
| Regular expressions library(C++11) | |||||||||||||||||||||||||
| Formatting library(C++20) | |||||||||||||||||||||||||
| Null-terminated sequence utilities | |||||||||||||||||||||||||
| Byte strings | |||||||||||||||||||||||||
| Multibyte strings | |||||||||||||||||||||||||
| Wide strings | |||||||||||||||||||||||||
| Primitive numeric conversions | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| Text encoding identifications | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
codecvt::lengthcodecvt::do_length | ||||
Defined in header <locale> | ||
public: int length( StateT& state,const ExternT* from,const ExternT* from_end, | (1) | |
protected: virtualint do_length( StateT& state,const ExternT* from,const ExternT* from_end, | (2) | |
do_length of the most derived class.ExternT characters from the character array defined by[from, from_end), given initial conversion statestate, to at mostmaxInternT characters, and returns the number ofExternT characters that such conversion would consume. Modifiesstate as if by executingdo_in(state, from, from_end, from, to, to+ max, to) for some imaginary[to, to+ max) output buffer.Contents |
The number ofExternT characters that would be consumed if converted bydo_in() until either allfrom_end- from characters were consumed ormaxInternT characters were produced, or a conversion error occurred.
The non-converting specializationstd::codecvt<char,char,std::mbstate_t> returnsstd::min(max, from_end- from).
#include <iostream>#include <locale>#include <string> int main(){using facet_type=std::codecvt<wchar_t,char,std::mbstate_t>; // narrow multibyte encodingstd::string s="z\u00df\u6c34\U0001d10b";// or u8"zß水𝄋"// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b" std::locale loc("en_US.UTF-8"); facet_typeconst& codecvt_facet=std::use_facet<facet_type>(loc);std::mbstate_t mb=std::mbstate_t();std::cout<<"Only the first "<< codecvt_facet.length(mb, s.data(), s.data()+ s.size(),2)<<" bytes out of "<< s.size()<<" would be consumed"" to produce the first 2 characters\n";}
Output:
Only the first 3 bytes out of 10 would be consumed to produce the first 2 characters
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 75 | C++98 | the effect onstate was not specified | specified |
| LWG 305 | C++98 | std::codecvt<wchar_t, char, std::mbstate_t>::do_lengthwas required to returnstd::min(max, from_end- from) | not required |
[virtual] | converts a string fromExternT toInternT, such as when reading from file(virtual protected member function)[edit] |