c32rtomb
|
헤더 파일에 정의됨
<uchar.h>
|
||
| (C11 이후) | ||
가변 길이 32비트 와이드 문자 표현(일반적으로 UTF-32)에서 단일 코드 포인트를 좁은 멀티바이트 문자 표현으로 변환합니다.
만약 s 가 null 포인터가 아니라면, 이 함수는 c32 의 멀티바이트 문자 표현을 저장하는 데 필요한 바이트 수를 (현재 멀티바이트 변환 상태 * ps 를 고려하여 시퀀스 전환을 포함하여) 결정하고, 멀티바이트 문자 표현을 s 가 가리키는 첫 번째 요소를 시작으로 하는 문자 배열에 저장하며, 필요에 따라 * ps 를 갱신합니다. 이 함수는 최대 MB_CUR_MAX 바이트까지 쓸 수 있습니다.
만약 s 가 null 포인터인 경우, 이 호출은 내부 버퍼 buf 에 대해 c32rtomb ( buf, U ' \0 ' , ps ) 와 동일합니다.
만약 c32 가 null 와이드 문자 U ' \0 ' 라면, 초기 shift 상태로 복원하는 데 필요한 shift sequence에 앞서 null 바이트가 저장되며, 변환 상태 매개변수 * ps 는 초기 shift 상태를 나타내도록 업데이트됩니다.
매크로 __STDC_UTF_32__ 가 정의된 경우, 이 함수가 사용하는 32비트 인코딩은 UTF-32입니다. 그렇지 않으면 구현에 따라 정의됩니다. 이 매크로는 항상 정의되어 있으며 인코딩은 항상 UTF-32입니다. (C23부터) 어떤 경우든, 이 함수가 사용하는 멀티바이트 문자 인코딩은 현재 활성화된 C 로캘에 의해 지정됩니다.
목차 |
매개변수
| s | - | 멀티바이트 문자가 저장될 narrow 문자 배열에 대한 포인터 |
| c32 | - | 변환할 32비트 와이드 문자 |
| ps | - | 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터 |
반환값
성공 시, s 가 가리키는 첫 번째 요소를 시작으로 하는 문자 배열에 기록된 바이트 수(시프트 시퀀스 포함)를 반환합니다. 이 값은 0 일 수 있으며, 예를 들어 다중 char32_t 유닛 시퀀스에서 선행 char32_t 유닛을 처리할 때 발생합니다(UTF-32에서는 발생하지 않음).
실패 시 ( c32 가 유효한 32비트 와이드 문자가 아닌 경우), - 1 을 반환하고, EILSEQ 을 errno 에 저장하며, * ps 는 지정되지 않은 상태로 둡니다.
예제
MSVC에서는 UTF_8이 올바르게 작동하려면
/utf-8
컴파일러 플래그가 필요합니다.
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <uchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); const char32_t in[] = U"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-32 code units: [", in_sz); for (size_t n = 0; n < in_sz; ++n) printf("%s%08X", n ? " " : "", in[n]); puts("]"); char* out = malloc(MB_CUR_MAX * in_sz); char* p = out; mbstate_t state = {0}; for (size_t n = 0; n < in_sz; ++n) { size_t rc = c32rtomb(p, in[n], &state); if(rc == (size_t)-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("%s%02X", x ? " " : "", +(unsigned char)out[x]); puts("]"); free(out); }
출력:
Processing 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000] into 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 7.30.1.6 c32rtomb 함수 (p: 411)
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.28.1.4 c32rtomb 함수 (p: 401)
참고 항목
|
(C11)
|
좁은 멀티바이트 문자를 UTF-32 인코딩으로 변환합니다
(함수) |
|
C++ documentation
for
c32rtomb
|
|