mbsrtowcs, mbsrtowcs_s
      From cppreference.com
     
     
     
     
     
     
     | 
           Defined in header
            
            <wchar.h>
            | ||
| (1) | ||
| (since C95) (until C99) | ||
| (since C99) | ||
| (2) | (since C11) | |
       
        1)
       
       Converts a null-terminated multibyte character sequence, which begins in the conversion state described by
       
      
        *ps
       
       , from the array whose first element is pointed to by
       
        
         
          *
         
         src
        
       
       to its wide character representation. If
       
        dst
       
       is not null, converted characters are 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. Each multibyte character is converted as if by a call to
       
        
         mbrtowc
        
       
       . The conversion stops if:
       - 
         The multibyte null character was converted and stored.
         
          
           
            *
           
           src
          
         
         is set to null pointer value and
         *psrepresents 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 ifdstis a null pointer.
       
        2)
       
       Same as
       
        (1)
       
       , except that
       
      - 
         the function returns its result as an out-parameter
         retval
- 
         if no null character was written to
         dstafterlenwide characters were written, then L ' \0 ' is stored indst[len], which means len+1 total wide characters are written
- 
         the function clobbers the destination array from the terminating null and until
         dstsz
- 
         If
         srcanddstoverlap, the behavior is unspecified.
- the following errors are detected at runtime and call the currently installed constraint handler function:
- 
         - 
           retval,ps,src, or * src is a null pointer
- 
           dstszorlenis greater than RSIZE_MAX/sizeof(wchar_t) (unlessdstis null)
- 
           dstszis not zero (unlessdstis null)
- 
           There is no null character in the first
           dstszmultibyte characters in the * src array andlenis greater thandstsz(unlessdstis null)
 
- 
           
- 
         As with all bounds-checked functions,
         mbsrtowcs_sis only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including <wchar.h> .
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 | 
| dstsz | - | max number of wide characters that will be written (size of the 
          dst
         array) | 
| retval | - | pointer to a size_t object where the result will be stored | 
Return value
       
        1)
       
       On success, returns the number of wide characters, excluding the terminating
       
        
         L
         
          '
          
           \0
          
          '
         
        
       
       , written to the character array. If
       
      
        dst
       
       is a null pointer, returns the number of wide characters that would have been written given unlimited length. On conversion error (if invalid multibyte character was encountered), returns
       
        
         
          (
         
         
          
           size_t
          
         
         
          )
         
         
          -
         
         
          1
         
        
       
       , stores
       
        
         EILSEQ
        
       
       in
       
        
         errno
        
       
       , and leaves
       
        
         
          *
         
         ps
        
       
       in unspecified state.
      
       
        2)
       
       zero on success (in which case the number of wide characters excluding terminating zero that were, or would be written to
       
      
        dst
       
       , is stored in
       
        
         
          *
         
         retval
        
       
       ), non-sero on error. In case of a runtime constraint violation, stores
       
        
         
          (
         
         
          
           size_t
          
         
         
          )
         
         
          -
         
         
          1
         
        
       
       in
       
        
         
          *
         
         retval
        
       
       (unless
       
        retval
       
       is null) and sets
       
        
         dst
         
          [
         
         
          0
         
         
          ]
         
        
       
       to
       
        
         L
         
          '
          
           \0
          
          '
         
        
       
       (unless
       
        dst
       
       is null or
       
        dstmax
       
       is zero or greater than
       
        RSIZE_MAX
       
       )
      Example
         Run this code
        
       #include <stdio.h> #include <locale.h> #include <wchar.h> #include <string.h> void print_as_wide(const char* mbstr) { mbstate_t state; memset(&state, 0, sizeof state); size_t len = 1 + mbsrtowcs(NULL, &mbstr, 0, &state); wchar_t wstr[len]; mbsrtowcs(&wstr[0], &mbstr, len, &state); wprintf(L"Wide string: %ls \n", wstr); wprintf(L"The length, including L'\\0': %zu\n", len); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); print_as_wide(u8"z\u00df\u6c34\U0001f34c"); // u8"zß水🍌" }
Output:
Wide string: zß水🍌 The length, including L'\0': 5
References
- C11 standard (ISO/IEC 9899:2011):
- 
         - 7.29.6.4.1 The mbsrtowcs function (p: 445)
 
- 
         - K.3.9.3.2.1 The mbsrtowcs_s function (p: 648-649)
 
- C99 standard (ISO/IEC 9899:1999):
- 
          - 7.24.6.4.1 The mbsrtowcs function (p: 391)
 
See also
| 
            
             
             
             
              
               (C11)
              
             
            
            | converts a narrow multibyte character string to wide string (function) | 
| 
            
             
              
               (C95)
              
             
            
            | converts the next multibyte character to wide character, given state (function) | 
| 
            
             
              
               (C95)
              
             
             
              
               (C11)
              
             
            
            | converts a wide string to narrow multibyte character string, given state (function) | 
| 
           
            
             C++ documentation
            
           
           for
           
            
             mbsrtowcs
            
           
           | |