Namespaces
Variants

wcrtomb, wcrtomb_s

cppreference.net에서
헤더에 정의됨 <wchar.h>
size_t wcrtomb( char* s, wchar_t wc, mbstate_t* ps);
(1) (since C95)
(until C99)
size_t wcrtomb( char* restrict s, wchar_t wc, mbstate_t* restrict ps);
(since C99)
errno_t wcrtomb_s(size_t* restrict retval, char* restrict s, rsize_t ssz,
                  wchar_t wc, mbstate_t* restrict ps);
(2) (since C11)

와이드 문자를 좁은 멀티바이트 표현으로 변환합니다.

1) 만약 s 이 널 포인터가 아니면, 함수는 wc (시프트 시퀀스를 포함하고, 현재 멀티바이트 변환 상태를 고려하여 *ps), 그리고 멀티바이트 문자 표현을 첫 번째 요소가 가리키는 문자 배열에 저장합니다. s, 필요에 따라 *ps 업데이트합니다. 최대 MB_CUR_MAX 바이트를 쓸 수 있습니다.
만약 s 이 널 포인터이면, 호출은 wcrtomb(buf, L'\0', ps)을(를) 내부 버퍼에 대해 buf.
wc가 널 와이드 문자이면 L'\0', 널 바이트가 저장되며, 초기 시프트 상태를 복원하는 데 필요한 시프트 시퀀스가 앞에 오고 변환 상태 매개변수 *ps는 초기 시프트 상태를 나타내도록 업데이트됩니다.
환경 매크로 __STDC_ISO_10646__가 정의된 경우, 타입 wchar_t의 값은 유니코드 필수 집합(일반적으로 UTF-32 인코딩)의 문자에 대한 짧은 식별자와 동일하며, 그렇지 않으면 구현 정의됩니다. 어쨌든, 이 함수에서 사용되는 멀티바이트 문자 인코딩은 현재 활성 C 로케일에 의해 지정됩니다.
2) 동일함 (1), 단 다음이 다릅니다.
만약 s 이 널 포인터이면, 호출은 wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps) 내부 변수 retval 및 buf (크기가 MB_CUR_MAX)
결과는 출력 매개변수 retval
에 반환됩니다. 다음 오류는 런타임에 감지되어 현재 설치된 제약 조건 처리기 함수를 호출합니다:
  • retval 또는 ps 은 널 포인터입니다.
  • ssz 이 0이거나 RSIZE_MAX보다 큽니다 ( s이 null이 아닌 경우)
  • ssz 은 기록될 바이트 수보다 작습니다 ( s이 null이 아닌 경우)
  • s 은 널 포인터이지만 ssz 는 0이 아닙니다
모든 경계 검사 함수와 마찬가지로, wcrtomb_s 는 다음 경우에만 사용 가능함이 보장됩니다: __STDC_LIB_EXT1__가 구현에 의해 정의되고 사용자가 __STDC_WANT_LIB_EXT1__를 정수 상수 1로 정의한 경우에 한함. 포함 전에 <wchar.h>.

매개변수

s - 멀티바이트 문자가 저장될 좁은 문자 배열에 대한 포인터
wc - 변환할 와이드 문자
ps - 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터
ssz - 쓸 최대 바이트 수 (버퍼의 크기 s)
retval - 결과(시프트 시퀀스를 포함한 멀티바이트 문자열의 바이트 수)가 저장될 출력 매개변수에 대한 포인터

반환값

1) 성공 시, 첫 번째 요소가 s이 가리키는 문자 배열에 기록된 바이트 수(시프트 시퀀스 포함)를 반환합니다.
실패 시(wc가 유효한 와이드 문자가 아닌 경우), (size_t)-1을 반환하고, EILSEQ를 errno에 저장하며, *ps을 지정되지 않은 상태로 둡니다.
2) 성공 시 0을 반환하고 실패 시 0이 아닌 값을 반환합니다. 이 경우, s[0]는 '\0'로 설정되며(s이 널이거나 ssz이 0이거나 RSIZE_MAX보다 큰 경우는 제외), *retval는 (size_t)-1로 설정됩니다(retval가 널이 아닌 경우).

예제

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    mbstate_t state;
    memset(&state, 0, sizeof state);
    wchar_t in[] = L"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    size_t in_sz = sizeof in / sizeof *in;
 
    printf("Processing %zu wchar_t units: [ ", in_sz);
    for (size_t n = 0; n < in_sz; ++n)
        printf("%#x ", (unsigned int)in[n]);
    puts("]");
 
    char out[MB_CUR_MAX * in_sz];
    char* p = out;
    for (size_t n = 0; n < in_sz; ++n)
    {
        int rc = wcrtomb(p, in[n], &state);
        if (rc == -1)
            break;
        p += rc;
    }
 
    size_t out_sz = p - out;
    printf("into %zu UTF-8 code units: [ ", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%#x ", +(unsigned char)out[x]);
    puts("]");
}

출력:

Processing 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]
into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.29.6.3.3 wcrtomb 함수 (p: TBD)
  • K.3.9.3.1.1 wcrtomb_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.29.6.3.3 wcrtomb 함수 (p: TBD)
  • K.3.9.3.1.1 wcrtomb_s 함수 (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.29.6.3.3 wcrtomb 함수 (p: 444)
  • K.3.9.3.1.1 wcrtomb_s 함수 (p: 647-648)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.24.6.3.3 wcrtomb 함수 (p: 390)

참고

와이드 문자를 멀티바이트 표현으로 변환합니다
(함수)
상태가 주어졌을 때 다음 멀티바이트 문자를 와이드 문자로 변환합니다
(함수)
C++ 문서의wcrtomb