std::mbrtoc32
cppreference.com
<tbody>
</tbody>
std::size_t mbrtoc32( char32_t* pc32, const char* s, std::size_t n, std::mbstate_t* ps ); |
( C++11) | |
UTF-32.
s , n , , s, , ( ). , s , 32- *pc32 ( pc32 ).
*s -char32_t ( UTF-32), *ps , mbrtoc32 char32_t, *s.
s , n pc32 , std::mbrtoc32(nullptr, "", 1, ps).
, *ps .
, , C.
| pc32 | , 32- | |
| s | , | |
| n | s, | |
| ps | , |
:
0, ,s(*pc32, ), .-
[1...n],s. -3,char32_t-char32_t*pc32. .-2,n, .*pc32.-1, .*pc32, EILSEQ errno,*ps.
#include <cassert>
#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
std::string str = "z\u00df\u6c34\U0001F34C"; // or u8"z"
std::cout << " " << str.size() << " : [ " << std::showbase;
for (unsigned char c : str)
std::cout << std::hex << +c << ' ';
std::cout << "]\n";
std::mbstate_t state{}; //
char32_t c32;
const char *ptr = str.c_str(), *end = str.c_str() + str.size() + 1;
while (std::size_t rc = std::mbrtoc32(&c32, ptr, end - ptr, &state))
{
std::cout << " UTF-32 : " << std::hex
<< static_cast<int>(c32) << " ";
assert(rc != (std::size_t) - 3); // UTF-32
if (rc == (std::size_t) - 1)
break;
if (rc == (std::size_t) - 2)
break;
std::cout << std::dec << rc << " [ ";
for (std::size_t n = 0; n < rc; ++n)
std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';
std::cout << "]\n";
ptr += rc;
}
}
:
10 : [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ]
UTF-32 : 0x7a 1 [ 0x7a ]
UTF-32 : 0xdf 2 [ 0xc3 0x9f ]
UTF-32 : 0x6c34 3 [ 0xe6 0xb0 0xb4 ]
UTF-32 : 0x1f34c 4 [ 0xf0 0x9f 0x8d 0x8c ]
(C++11) |
32- () |
[virtual] |
externT internT, , (virtual protected std::codecvt -)
|
C mbrtoc32
| |