mbrtoc16, mbrtoc32

Translates the first UTF-8 multibyte character in a string into the equivalent UTF-16 or UTF-32 character.


size_t mbrtoc16(
   char16_t* destination,
   const char* source,
   size_t max_bytes,
   mbstate_t* state

size_t mbrtoc32(
   char32_t* destination,
   const char* source,
   size_t max_bytes,
   mbstate_t* state


Pointer to the char16_t or char32_t equivalent of the UTF-8 multibyte character to convert. If null, the function doesn't store a value.

Pointer to the UTF-8 multibyte character string to convert.

The maximum number of bytes in source to examine for a character to convert. This argument should be a value between one and the number of bytes, including any null terminator, remaining in source.

Pointer to a mbstate_t conversion state object used to interpret the UTF-8 multibyte string to one or more output characters.

Return value

On success, returns the value of the first of these conditions that applies, given the current state value:

Value Condition
0 The next max_bytes or fewer characters converted from source correspond to the null wide character, which is the value stored if destination isn't null.

state contains the initial shift state.
Between 1 and max_bytes, inclusive The value returned is the number of bytes of source that complete a valid multibyte character. The converted wide character is stored if destination isn't null.
-3 The next wide character resulting from a previous call to the function has been stored in destination if destination isn't null. No bytes from source are consumed by this call to the function.

When source points to a UTF-8 multibyte character that requires more than one wide character to represent (for example, a surrogate pair), then the state value is updated so that the next function call writes out the extra character.
-2 The next max_bytes bytes represent an incomplete, but potentially valid, UTF-8 multibyte character. No value is stored in destination. This result can occur if max_bytes is zero.
-1 An encoding error has occurred. The next max_bytes or fewer bytes don't contribute to a complete and valid UTF-8 multibyte character. No value is stored in destination.

EILSEQ is stored in errno and the conversion state value state is unspecified.


The mbrtoc16 function reads up to max_bytes bytes from source to find the first complete, valid UTF-8 multibyte character, and then stores the equivalent UTF-16 character in destination. If the character requires more than one UTF-16 output character, such as a surrogate pair, then the state value is set to store the next UTF-16 character in destination on the next call to mbrtoc16. The mbrtoc32 function is identical, but output is stored as a UTF-32 character.

If source is null, these functions return the equivalent of a call made using arguments of NULL for destination, "" (an empty, null-terminated string) for source, and 1 for max_bytes. The passed values of destination and max_bytes are ignored.

If source isn't null, the function starts at the beginning of the string and inspects up to max_bytes bytes to determine the number of bytes required to complete the next UTF-8 multibyte character, including any shift sequences. If the examined bytes contain a valid and complete UTF-8 multibyte character, the function converts the character into the equivalent 16-bit or 32-bit wide character or characters. If destination isn't null, the function stores the first (and possibly only) result character in destination. If extra output characters are required, a value is set in state, so that subsequent calls to the function output the extra characters and return the value -3. If no more output characters are required, then state is set to the initial shift state.

To convert non-UTF-8 multibyte characters to UTF-16 LE characters, use the mbrtowc, mbtowc, or _mbtowc_l functions.

By default, this function's global state is scoped to the application. To change this behavior, see Global state in the CRT.


Function C header C++ header
mbrtoc16, mbrtoc32 <uchar.h> <cuchar>

For more compatibility information, see Compatibility.

See also

Data conversion
Interpretation of multibyte-character sequences
c16rtomb, c32rtomb