std::codecvt_utf16(3)
πΈ std::codecvt_utf16 β NAME πΈ
std::codecvt_utf16 β bestie, it's literally std::codecvt_utf16, the facet that speaks UTF-16 π
This page lives in the C++ Standard Library manual, section 3. Pull up a chair π«Ά
β¨ Synopsis β¨
Defined in header <codecvt>
template<
class Elem, (since C++11)
unsigned long Maxcode = 0x10ffff, (deprecated in C++17)
std::codecvt_mode Mode = (std::codecvt_mode)0 > (removed in C++26)
class codecvt_utf16
: public std::codecvt<Elem, char, std::mbstate_t>;
Heads up queen: this whole thing is deprecated in C++17 and removed in C++26. So likeβ¦ use it if you must, but know it's on its way out π
Okay so std::codecvt_utf16 is a std::codecvt facet that encapsulates conversion between a UTF-16 encoded byte string and a UCS-2 or UTF-32 character string (which one depends on the type of Elem). This std::codecvt facet can be used to read and write UTF-16 files in binary mode. No cap, that's the whole gig π₯
UCS-2 is the same encoding as UTF-16, except that it encodes scalar values in the range U+0000-U+FFFF (Basic Multilingual Plane) only (since C++23). So it's UTF-16's little sibling with a smaller range π
π¦ Template Parameters π¦
Elemβ eitherchar16_t,char32_t, orwchar_tMaxcodeβ the largest value ofElemthat this facet will read or write without errorModeβ a constant of typestd::codecvt_mode
π Member functions π
- constructor β constructs a new
codecvt_utf16facet (public member function) - destructor β destroys a
codecvt_utf16facet (public member function)
π std::codecvt_utf16::codecvt_utf16 π
explicit codecvt_utf16( std::size_t refs = 0 );
Constructs a new std::codecvt_utf16 facet, passes the initial reference counter refs to the base class. Simple as that, periodt β¨
Parameters
refsβ the number of references that link to the facet
π std::codecvt_utf16::~codecvt_utf16 π
~codecvt_utf16();
Destroys the facet. Iconic detail: unlike the locale-managed facets, this facet's destructor is public π
π Inherited from std::codecvt π
Member types
intern_typeβinternTextern_typeβexternTstate_typeβstateT
Member objects
id(static) β typestd::locale::id
Member functions
outβ invokesdo_out(public member function ofstd::codecvt<InternT,ExternT,StateT>)inβ invokesdo_in(public member function ofstd::codecvt<InternT,ExternT,StateT>)unshiftβ invokesdo_unshift(public member function ofstd::codecvt<InternT,ExternT,StateT>)encodingβ invokesdo_encoding(public member function ofstd::codecvt<InternT,ExternT,StateT>)always_noconvβ invokesdo_always_noconv(public member function ofstd::codecvt<InternT,ExternT,StateT>)lengthβ invokesdo_length(public member function ofstd::codecvt<InternT,ExternT,StateT>)max_lengthβ invokesdo_max_length(public member function ofstd::codecvt<InternT,ExternT,StateT>)
π₯ Protected member functions π₯
do_out[virtual]β converts a string fromInternTtoExternT, such as when writing to file (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_in[virtual]β converts a string fromExternTtoInternT, such as when reading from file (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_unshift[virtual]β generates the termination character sequence ofExternTcharacters for incomplete conversion (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_encoding[virtual]β returns the number ofExternTcharacters necessary to produce oneInternTcharacter, if constant (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_always_noconv[virtual]β tests if the facet encodes an identity conversion for all valid argument values (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_length[virtual]β calculates the length of theExternTstring that would be consumed by conversion into givenInternTbuffer (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)do_max_length[virtual]β returns the maximum number ofExternTcharacters that could be converted into a singleInternTcharacter (virtual protected member function ofstd::codecvt<InternT,ExternT,StateT>)
β Inherited from std::codecvt_base β
Member types
enum result { ok, partial, error, noconv };β unscoped enumeration type
Enumeration constants
okβ conversion was completed with no errorpartialβ not all source characters were convertederrorβ encountered an invalid characternoconvβ no conversion required, input and output types are the same
π Notes π
Okay so this is the messy part, bestie, listen up π Although the standard requires that this facet works with UCS-2 when the size of Elem is 16 bits, some implementations use UTF-16 instead, making this a non-converting locale. The term "UCS-2" was deprecated and removed from ISO 10646.
And since C++23, UCS-2 does not refer to its original definition anymore. It becomes a synonym of UTF-16, but with a smaller encoding range. The way the terminology keeps shiftingβ¦ π
π§ Example π§
The following example demonstrates decoding of UTF-16le file on a system with 32-bit wchar_t. On a system with 16-bit wchar_t, decoding of the third character will fail because std::codecvt_utf16<char16_t> produces UCS-2, not UTF-16. Yeah. Read that again before you file a bug π«Ά
// Run this code
#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
void prepare_file()
{
// UTF-16le data (if host system is little-endian)
char16_t utf16le[4] = {0x007a, // latin small letter 'z' U+007a
0x6c34, // CJK ideograph "water" U+6c34
0xd834, 0xdd0b}; // musical sign segno U+1d10b
// store in a file
std::ofstream fout("text.txt");
fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le);
}
int main()
{
prepare_file();
// open as a byte stream
std::wifstream fin("text.txt", std::ios::binary);
// apply facet
fin.imbue(std::locale(fin.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
wchar_t c = 0;
for (std::cout << std::showbase << std::hex; fin.get(c);
std::cout << static_cast<std::wint_t>(c) << '\n');
}
Output
0x7a
0x6c34
0x1d10b
Look at that. Slayed. β¨
π See also π
Character conversions π
The big grid has these columns: Character conversions Β· locale-defined multibyte (UTF-8, GB18030) Β· UTF-8 Β· UTF-16
- UTF-16 β
mbrtoc16 / c16rtomb(with C11's DR488) Β·codecvt_utf8_utf16<char16_t>,codecvt_utf8_utf16<char32_t>,codecvt_utf8_utf16<wchar_t>Β·N/A - UCS-2 β
c16rtomb(without C11's DR488) Β·codecvt_utf8<char16_t>,codecvt<char16_t,char,mbstate_t>Β·codecvt_utf16<char16_t> - UTF-32 β
mbrtoc32 / c32rtombΒ·codecvt<char32_t,char,mbstate_t>,codecvt_utf8<char32_t>Β·codecvt_utf16<char32_t> - system
wchar_t: UTF-32 (non-Windows), UCS-2 (Windows) βmbsrtowcs / wcsrtombsΒ·use_facet<codecvt<wchar_t,char,mbstate_t>>(locale),codecvt_utf8<wchar_t>Β·codecvt_utf16<wchar_t>
The related cast π
codecvtβ converts between character encodings, including UTF-8, UTF-16, UTF-32 (class template)codecvt_mode(C++11) (deprecated in C++17) (removed in C++26) β tags to alter behavior of the standard codecvt facets (enum)codecvt_utf8(C++11) (deprecated in C++17) (removed in C++26) β converts between UTF-8 and UCS-2/UCS-4 (class template)codecvt_utf8_utf16(C++11) (deprecated in C++17) (removed in C++26) β converts between UTF-8 and UTF-16 (class template)
That's the whole page, bestie β go forth and decode responsibly π This cutie came from http://cppreference.com, version 2024.06.10, and the page is std::codecvt_utf16(3). Mwah π«Άβ¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms