std::codecvt_utf8
cppreference.com
[] |
Google. . , . , . |
<metanoindex/>
<tbody> </tbody> template< class Elem, unsigned long Maxcode = 0x10ffff, std::codecvt_mode Mode = (std::codecvt_mode)0 > class codecvt_utf8 : public std::codecvt<Elem, char, std::mbstate_t>; |
||
std::codecvt_utf8 std::codecvt , UTF-8 UCS2 UCS4 (
Elem). codecvt UTF-8 , , . :
std::codecvt_utf8 is a std::codecvt facet which encapsulates conversion between a UTF-8 encoded byte string and UCS2 or UCS4 character string (depending on the type of
Elem). This codecvt facet can be used to read and write UTF-8 files, both text and binary. | Elem | ||
| Maxcode | Elem, | |
| Mode |
std::codecvt
Member types
intern_type
|
internT
|
extern_type
|
externT
|
state_type
|
stateT
|
Member objects
| Type | |
id ()
|
std::locale::id |
Member functions
do_out (public - std::codecvt)
| |
do_in (public - std::codecvt)
| |
do_unshift (public - std::codecvt)
| |
do_encoding (public - std::codecvt)
| |
do_always_noconv (public - std::codecvt)
| |
do_length (public - std::codecvt)
| |
do_max_length (public - std::codecvt)
|
Protected member functions
[virtual] |
internT externT, , (virtual protected std::codecvt -)
|
[virtual] |
externT internT, , (virtual protected std::codecvt -)
|
[virtual] |
externT : generates the termination character sequence of externT characters for incomplete conversion (virtual protected std::codecvt -)
|
[virtual] |
externT , internT , : returns the number of externT characters necessary to produce one internT character, if constant (virtual protected std::codecvt -)
|
[virtual] |
, (virtual protected std::codecvt -)
|
[virtual] |
externT , internT : calculates the length of the externT string that would be consumed by conversion into given internT buffer (virtual protected std::codecvt -)
|
[virtual] |
externT , internT : returns the maximum number of externT characters that could be converted into a single internT character (virtual protected std::codecvt -)
|
UCS2/UTF-8 UTF-16/UTF-8 : UCS2 .
:
The following example demonstrates the difference between UCS2/UTF-8 and UTF-16/UTF-8 conversions: the third character in the string is not a valid UCS2 character.
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main()
{
// UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS2
std::string utf8 = u8"z\u6c34\U0001d10b";
// the UTF-8 / UTF-16 standard conversion facet
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
std::u16string utf16 = utf16conv.from_bytes(utf8);
std::cout << "UTF16 conversion produced " << utf16.size() << " code points:\n";
for(char16_t c : utf16)
std::cout << std::hex << std::showbase << c << '\n';
// the UTF-8 / UCS2 standard conversion facet
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;
try {
std::u16string ucs2 = ucs2conv.from_bytes(utf8);
} catch(const std::range_error& e) {
std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted()));
std::cout << "UCS2 failed after producing " << std::dec << ucs2.size()<<" characters:\n";
for(char16_t c : ucs2)
std::cout << std::hex << std::showbase << c << '\n';
}
}
:
UTF16 conversion produced 4 code points:
0x7a
0x6c34
0xd834
0xdd0b
UCS2 failed after producing 2 characters:
0x7a
0x6c34
.
| Character conversions |
narrow multibyte (char) |
UTF-8 (char) |
UTF-16 (char16_t) |
|---|---|---|---|
| UTF-16 | mbrtoc16 / c16rtomb | codecvt<char16_t, char, mbstate_t> codecvt_utf8_utf16<char16_t> codecvt_utf8_utf16<char32_t> codecvt_utf8_utf16<wchar_t> |
/ |
| UCS2 | codecvt_utf8<char16_t> | codecvt_utf16<char16_t> | |
| UTF-32/UCS4 (char32_t) |
mbrtoc32 / c32rtomb | codecvt<char32_t, char, mbstate_t> codecvt_utf8<char32_t> |
codecvt_utf16<char32_t> |
| UCS2/UCS4 (wchar_t) |
codecvt_utf8<wchar_t> | codecvt_utf16<wchar_t> | |
| wide (wchar_t) |
codecvt<wchar_t, char, mbstate_t> mbsrtowcs / wcsrtombs |
| , UTF-8, UTF-16, UTF-32 ( ) | |
(C++11)( C++17) |
codecvt () |
(C++11)( C++17) |
UTF-16 UCS-2/UCS-4 ( ) |
(C++11)( C++17) |
UTF-8 UTF-16 ( ) |