table of contents
        
      
      
    | std::mbrtoc16(3) | C++ Standard Libary | std::mbrtoc16(3) | 
NAME¶
std::mbrtoc16 - std::mbrtoc16
Synopsis¶
 Defined in header <cuchar>
  
   std::size_t mbrtoc16( char16_t* pc16,
  
   const char* s, (since C++11)
  
   std::size_t n,
  
   std::mbstate_t* ps );
  
   Converts a narrow multibyte character to UTF-16 character representation.
  
   If s is not a null pointer, inspects at most n bytes of the multibyte
    character
  
   string, beginning with the byte pointed to by s to determine the number of
    bytes
  
   necessary to complete the next multibyte character (including any shift
    sequences).
  
   If the function determines that the next multibyte character in s is complete
    and
  
   valid, converts it to the corresponding 16-bit character and stores it in
    *pc16 (if
  
   pc16 is not null).
  
   If the multibyte character in *s corresponds to a multi-char16_t sequence
    (e.g. a
  
   surrogate pair in UTF-16), then after the first call to this function, *ps is
  
   updated in such a way that the next call to mbrtoc16 will write out the
    additional
  
   char16_t, without considering *s.
  
   If s is a null pointer, the values of n and pc16 are ignored and the call is
  
   equivalent to std::mbrtoc16(nullptr, "", 1, ps).
  
   If the wide character produced is the null character, the conversion state
    *ps
  
   represents the initial shift state.
  
   The multibyte encoding used by this function is specified by the currently
    active C
  
   locale.
Parameters¶
 pc16 - pointer to the location where the resulting 16-bit
    character will be written
  
   s - pointer to the multibyte character string used as input
  
   n - limit on the number of bytes in s that can be examined
  
   ps - pointer to the conversion state object used when interpreting the
    multibyte
  
   string
Return value¶
The first of the following that applies:
  
   * 0 if the character converted from s (and stored in *pc16 if non-null) was
  
   the null character
  
   * the number of bytes [1...n] of the multibyte character successfully
    converted
  
   from s
  
   * -3 if the next char16_t from a multi-char16_t character (e.g. a surrogate
    pair)
  
   has now been written to *pc16. No bytes are processed from the input in this
  
   case.
  
   * -2 if the next n bytes constitute an incomplete, but so far valid,
    multibyte
  
   character. Nothing is written to *pc16.
  
   * -1 if encoding error occurs. Nothing is written to *pc16, the value EILSEQ
    is
  
   stored in errno and the value of *ps is unspecified.
Example¶
// Run this code
  
   #include <iostream>
  
   #include <iomanip>
  
   #include <clocale>
  
   #include <cstring>
  
   #include <cwchar>
  
   #include <cuchar>
  
   int main()
  
   {
  
   std::setlocale(LC_ALL, "en_US.utf8");
  
   std::string str = "z\u00df\u6c34\U0001F34C"; // or
    u8"zß水🍌"
  
   std::cout << "Processing " << str.size() <<
    " bytes: [ " << std::showbase;
  
   for(unsigned char c: str) std::cout << std::hex << +c << '
    ';
  
   std::cout << "]\n";
  
   std::mbstate_t state{}; // zero-initialized to initial state
  
   char16_t c16;
  
   const char *ptr = &str[0], *end = &str[0] + str.size();
  
   while(std::size_t rc = std::mbrtoc16(&c16, ptr, end - ptr + 1,
    &state))
  
   {
  
   std::cout << "Next UTF-16 char: " << std::hex
  
   << static_cast<int>(c16) << " obtained from ";
  
   if(rc == (std::size_t)-3)
  
   std::cout << "earlier surrogate pair\n";
  
   else if(rc == (std::size_t)-2)
  
   break;
  
   else if(rc == (std::size_t)-1)
  
   break;
  
   else {
  
   std::cout << std::dec << rc << " bytes [ ";
  
   for(std::size_t n = 0; n < rc; ++n)
  
   std::cout << std::hex << +static_cast<unsigned
    char>(ptr[n]) << ' ';
  
   std::cout << "]\n";
  
   ptr += rc;
  
   }
  
   }
  
   }
Output:¶
 Processing 10 bytes: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f
    0x8d 0x8c ]
  
   Next UTF-16 char: 0x7a obtained from 1 bytes [ 0x7a ]
  
   Next UTF-16 char: 0xdf obtained from 2 bytes [ 0xc3 0x9f ]
  
   Next UTF-16 char: 0x6c34 obtained from 3 bytes [ 0xe6 0xb0 0xb4 ]
  
   Next UTF-16 char: 0xd83c obtained from 4 bytes [ 0xf0 0x9f 0x8d 0x8c ]
  
   Next UTF-16 char: 0xdf4c obtained from earlier surrogate pair
See also¶
 c16rtomb convert a 16-bit wide character to narrow multibyte
    string
  
   (C++11) (function)
  
   do_in converts a string from externT to internT, such as when reading from
    file
  
   [virtual] (virtual protected member function of
    std::codecvt<InternT,ExternT,State>)
| 2022.07.31 | http://cppreference.com |