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)
참고
(C11) |
와이드 문자를 멀티바이트 표현으로 변환합니다 (함수) |
(C95) |
상태가 주어졌을 때 다음 멀티바이트 문자를 와이드 문자로 변환합니다 (함수) |
C++ 문서의wcrtomb
| |