std::codecvt_byname
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Text processing library
Regular expressions library (C++11)
Formatting library (C++20)
Localization library
String and stream conversions
Unicode conversion facets
C library locales
(C++11/17/26*)
(C++11/17/26*)
(C++11/17/26*)
(C++11/17/26*)
(C++11/17/26*)
(C++11/17/26*)
Defined in header
<locale>
template< class InternT, class ExternT, class State >
class codecvt_byname : public std::codecvt <InternT, ExternT, State>;
class codecvt_byname : public std::codecvt <InternT, ExternT, State>;
std::codecvt_byname
is a std::codecvt facet which encapsulates multibyte/wide character conversion rules of a locale specified at its construction.
Contents
[edit] Specializations
The standard library is guaranteed to provide the following specializations:
Defined in header
<locale>
std::codecvt_byname<char, char, std::mbstate_t >
identity conversion
std::codecvt_byname<char16_t, char, std::mbstate_t >
(since C++11)(deprecated in C++20) conversion between UTF-16 and UTF-8
(since C++11)(deprecated in C++20) conversion between UTF-16 and UTF-8
std::codecvt_byname<char16_t, char8_t, std::mbstate_t >
(since C++20) conversion between UTF-16 and UTF-8
(since C++20) conversion between UTF-16 and UTF-8
std::codecvt_byname<char32_t, char, std::mbstate_t >
(since C++11)(deprecated in C++20) conversion between UTF-32 and UTF-8
(since C++11)(deprecated in C++20) conversion between UTF-32 and UTF-8
std::codecvt_byname<char32_t, char8_t, std::mbstate_t >
(since C++20) conversion between UTF-32 and UTF-8
(since C++20) conversion between UTF-32 and UTF-8
std::codecvt_byname<wchar_t, char, std::mbstate_t >
locale-specific conversion between wide string and narrow character sets
[edit] Member functions
std::codecvt_byname::codecvt_byname
explicit codecvt_byname( const char* name, std::size_t refs = 0 );
explicit codecvt_byname( const std::string & name, std::size_t refs = 0 );
(since C++11)
Constructs a new std::codecvt_byname
facet for a locale with name.
refs is used for resource management: if refs == 0, the implementation destroys the facet, when the last std::locale object holding it is destroyed. Otherwise, the object is not destroyed.
Parameters
name
-
the name of the locale
refs
-
the number of references that link to the facet
std::codecvt_byname::~codecvt_byname
protected:
~codecvt_byname();
~codecvt_byname();
Destroys the facet.
Inherited from std::codecvt
Nested types
Type
Definition
intern_type
internT
extern_type
externT
state_type
stateT
[edit] Data members
Member
Description
Member functions
Protected member functions
[virtual]
InternT
to ExternT
, such as when writing to file (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
ExternT
to InternT
, such as when reading from file (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
ExternT
characters for incomplete conversion (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
ExternT
characters necessary to produce one InternT
character, if constant (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
(virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
ExternT
string that would be consumed by conversion into given InternT
buffer (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
[virtual]
ExternT
characters that could be converted into a single InternT
character (virtual protected member function of
std::codecvt<InternT,ExternT,StateT>
) [edit]
Inherited from std::codecvt_base
Nested type
Definition
enum result { ok, partial, error, noconv };
Unscoped enumeration type
Enumeration constant
Definition
ok
conversion was completed with no error
partial
not all source characters were converted
error
encountered an invalid character
noconv
no conversion required, input and output types are the same
[edit] Example
This example demonstrates reading a GB18030-encoded file using the codecvt facet from a GB18030-aware locale.
Run this code
#include <fstream> #include <iostream> #include <locale> #include <string> int main() { // GB18030 narrow multibyte encoding std::ofstream ("text.txt") << "\x7a" // letter 'z', U+007a "\x81\x30\x89\x38" // letter 'ß', U+00df "\xcb\xae" // CJK ideogram '水' (water), U+6c34 "\x94\x32\xbc\x35"; // musical sign '𝄋' (segno), U+1d10b std::wifstream fin("text.txt"); fin.imbue(std::locale (fin.getloc(), new std::codecvt_byname<wchar_t, char, std::mbstate_t >("zh_CN.gb18030"))); for (wchar_t c; fin.get(c);) std::cout << std::hex << std::showbase << static_cast<unsigned>(c) << '\n'; }
Possible output:
0x7a 0xdf 0x6c34 0x1d10b
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 21 | C++98 | the standard library did not need to provide any std::codecvt_byname specializations
|
two specializations are required |