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 함수
참고 항목
|
다음 멀티바이트 문자를 와이드 문자로 변환
(함수) |
|
|
(C95)
(C11)
|
상태 정보를 사용하여 와이드 문자를 멀티바이트 표현으로 변환
(함수) |
|
C++ documentation
for
wctomb
|
|