std::mbsrtowcs(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

🌸 NAME 🌸

std::mbsrtowcs β€” okay so the name is literally std::mbsrtowcs, no plot twist. This is the std::mbsrtowcs(3) page from the C++ Standard Libary (their spelling, not mine, love that for them πŸ’…). We're converting multibyte strings to wide strings, and it's highkey iconic.

πŸ¦‹ Synopsis πŸ¦‹

The synopsis says Defined in header <cwchar>, bestie, and the signature is exactly this:

std::size_t mbsrtowcs( wchar_t* dst,

                       const char** src,
                       std::size_t len,

                       std::mbstate_t* ps );

So what does it do? It converts a null-terminated multibyte character sequence β€” one that begins in the conversion state described by *ps β€” from the array whose first element is pointed to by *src into its wide character representation. If dst is not null, the converted characters get stored in the successive elements of the wchar_t array pointed to by dst. No more than len wide characters are written to the destination array. Periodt.

Each multibyte character is converted as if by a call to std::mbrtowc. The conversion stops if:

  • The multibyte null character was converted and stored. src is set to a null pointer and *ps represents the initial shift state.
  • An invalid multibyte character (according to the current C locale) was encountered. src is set to point at the beginning of the first unconverted multibyte character.
  • The next wide character to be stored would exceed len. src is set to point at the beginning of the first unconverted multibyte character. This condition is not checked if dst is a null pointer.
Vibe check: those stop conditions are literally the whole personality of this function, so don't skip them πŸ’–

πŸ’– Parameters πŸ’–

  • dst β€” pointer to wide character array where the results will be stored.
  • src β€” pointer to pointer to the first element of a null-terminated multibyte string.
  • len β€” number of wide characters available in the array pointed to by dst.
  • ps β€” pointer to the conversion state object.

✨ Return value ✨

On success, it returns the number of wide characters, excluding the terminating L'\0', written to the character array. If dst is a null pointer, it returns the number of wide characters that would have been written given unlimited length.

On conversion error (if an invalid multibyte character was encountered), it returns static_cast<std::size_t>(-1), stores EILSEQ in errno, and leaves *ps in unspecified state. Not cute, but that's the deal.

πŸŽ€ Notes πŸŽ€

This function moves the src pointer to the end of the converted multibyte string. This doesn't happen if dst is a null pointer. iykyk ✨

πŸ’… Example πŸ’…

// Run this code

#include <clocale>
#include <cwchar>
#include <iostream>
#include <vector>

void print_as_wide(const char* mbstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state);
    std::vector<wchar_t> wstr(len);
    std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state);
    std::wcout << "Wide string: " << &wstr[0] << '\n'
               << "The length, including '\\0': " << wstr.size() <<
       '\n';
}

int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = "z\u00df\u6c34\U0001f34c"; // or u8"zß水🍌"
    print_as_wide(mbstr);
}

🌈 Output 🌈

Wide string: zß水🍌
The length, including '\0': 5

πŸ‘‘ See also πŸ‘‘

  • mbrtowc β€” converts the next multibyte character to wide character, given state (function).
  • wcsrtombs β€” converts a wide string to narrow multibyte character string, given state (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,StateT>).
  • C documentation for mbsrtowcs.

Okay bestie, that's the whole page πŸ’– source: http://cppreference.com, version/date: 2024.06.10, page: std::mbsrtowcs(3). Go slay your multibyte conversions, no cap 🫢✨

πŸ“¦ where this page comes from