Namespaces
Variants

wctomb, wctomb_s

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
int wctomb ( char * s, wchar_t wc ) ;
(1)
errno_t wctomb_s ( int * restrict status, char * restrict s, rsize_t ssz, wchar_t wc ) ;
(2) (C11 이후)
1) 와이드 문자 wc 를 멀티바이트 인코딩으로 변환하고 (시프트 시퀀스를 포함하여) s 가 가리키는 첫 번째 요소를 시작으로 하는 char 배열에 저장합니다. MB_CUR_MAX 개 이하의 문자만 저장됩니다. 변환은 현재 로케일의 LC_CTYPE 카테고리에 영향을 받습니다.
만약 wc 가 널 문자라면, 초기 shift 상태를 복원하는 데 필요한 모든 shift 시퀀스 앞에 널 바이트가 s 에 기록됩니다.
만약 s 가 널 포인터인 경우, 이 함수는 전역 변환 상태를 재설정하고 시프트 시퀀스 사용 여부를 결정합니다.
2) (1) 과 동일하지만, 결과가 출력 매개변수 status 에 반환되며 다음 오류들이 런타임에 감지되어 현재 설치된 constraint handler 함수를 호출합니다:
  • ssz 가 (null이 아닌 경우) 기록될 바이트 수보다 작음
  • ssz RSIZE_MAX 보다 큼 ( s 가 null이 아닌 경우)
  • s 가 null 포인터이지만 ssz 가 0이 아님
모든 경계 검사 함수와 마찬가지로, wctomb_s 는 구현에서 __STDC_LIB_EXT1__ 가 정의되고 사용자가 <stdlib.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다.

목차

참고 사항

wctomb 에 대한 각 호출은 내부 전역 변환 상태(이 함수만이 알고 있는 mbstate_t 타입의 정적 객체)를 갱신합니다. 멀티바이트 인코딩이 shift state를 사용하는 경우, 이 함수는 재진입 가능하지 않습니다. 어떤 경우든 여러 스레드는 동기화 없이 wctomb 를 호출해서는 안 됩니다: 대신 wcrtomb 또는 wctomb_s 를 사용할 수 있습니다.

대부분의 경계 검사 함수와 달리, wctomb_s 는 출력을 null로 종료하지 않습니다. 이는 문자열을 문자 단위로 처리하는 루프에서 사용되도록 설계되었기 때문입니다.

매개변수

s - 출력용 문자 배열에 대한 포인터
wc - 변환할 와이드 문자
ssz - s 에 기록할 최대 바이트 수 ( s 배열의 크기)
status - 결과(멀티바이트 시퀀스 길이 또는 시프트 시퀀스 상태)가 저장될 출력 매개변수에 대한 포인터

반환값

1) 만약 s 가 null 포인터가 아닌 경우, wc 의 멀티바이트 표현에 포함된 바이트 수를 반환하거나, - 1 를 반환합니다(만약 wc 가 유효하지 않은 문자인 경우).
만약 s 가 null 포인터라면, 내부 변환 상태를 초기 shift 상태를 나타내도록 재설정하고 현재 멀티바이트 인코딩이 상태 독립적(shift 시퀀스를 사용하지 않음)이면 0 을 반환하거나 현재 멀티바이트 인코딩이 상태 의존적(shift 시퀀스를 사용함)이면 0이 아닌 값을 반환합니다.
2) 성공 시 0을 반환하며, 이 경우 wc 의 멀티바이트 표현이 s 에 저장되고 그 길이가 * status 에 저장됩니다(또는 s 가 null인 경우 시퀀스 전환 상태가 status 에 저장됩니다). 인코딩 오류 또는 런타임 제약 조건 위반 시 0이 아닌 값을 반환하며, 이 경우 ( size_t ) - 1 * status 에 저장됩니다. * status 에 저장되는 값은 절대 MB_CUR_MAX 를 초과하지 않습니다.

예제

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void demo(wchar_t wc)
{
    const char* dep = wctomb(NULL, wc) ? "Yes" : "No";
    printf("State-dependent encoding? %s.\n", dep);
    char mb[MB_CUR_MAX];
    int len = wctomb(mb, wc);
    printf("wide char '%lc' -> multibyte char [", wc);
    for (int idx = 0; idx < len; ++idx)
        printf("%s%#2x", idx ? " " : "", (unsigned char)mb[idx]);
    printf("]\n");
}
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    printf("MB_CUR_MAX = %zu\n", MB_CUR_MAX);
    demo(L'A');
    demo(L'\u00df');
    demo(L'\U0001d10b');
}

가능한 출력:

MB_CUR_MAX = 6
State-dependent encoding? No.
wide char 'A' -> multibyte char [0x41]
State-dependent encoding? No.
wide char 'ß' -> multibyte char [0xc3 0x9f]
State-dependent encoding? No.
wide char '𝄋' -> multibyte char [0xf0 0x9d 0x84 0x8b]

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.7.3 wctomb 함수 (p: 261)
  • K.3.6.4.1 wctomb_s 함수 (p: 443)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.7.3 wctomb 함수 (p: 358-359)
  • K.3.6.4.1 wctomb_s 함수 (p: 610-611)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.20.7.3 wctomb 함수 (p: 322-323)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.10.7.3 wctomb 함수

참고 항목

다음 멀티바이트 문자를 와이드 문자로 변환
(함수)
상태 정보를 사용하여 와이드 문자를 멀티바이트 표현으로 변환
(함수)