mbrtoc32
|
헤더 파일에 정의됨
<uchar.h>
|
||
| (C11 이후) | ||
단일 코드 포인트를 좁은 멀티바이트 문자 표현에서 가변 길이 32비트 와이드 문자 표현(일반적으로 UTF-32)으로 변환합니다.
만약 s 가 null 포인터가 아니라면, 최대 n 바이트까지의 멀티바이트 문자 문자열을 검사하여(현재 멀티바이트 변환 상태 * ps 를 고려하며, s 가 가리키는 바이트부터 시작) 다음 멀티바이트 문자를 완성하는 데 필요한 바이트 수를 결정합니다(시프트 시퀀스 포함). 만약 함수가 s 에 있는 다음 멀티바이트 문자가 완전하고 유효하다고 판단하면, 이를 해당하는 32비트 와이드 문자로 변환하여 * pc32 에 저장합니다( pc32 가 null이 아닌 경우).
*
s
에 있는 멀티바이트 문자가
다중
char32_t
시퀀스에 해당하는 경우(UTF-32에서는 불가능),
이 함수의 첫 번째 호출 이후
*
ps
는
mbrtoc32
의 다음 호출들이
*
s
를 고려하지 않고 추가
char32_t
를 출력하도록 업데이트됩니다.
만약 s 가 null 포인터라면, n 과 pc32 의 값은 무시되며, 이 호출은 mbrtoc32 ( NULL , "" , 1 , ps ) 와 동일합니다.
생성된 와이드 문자가 널 문자인 경우, 변환 상태 * ps 는 초기 시프트 상태를 나타냅니다.
매크로 __STDC_UTF_32__ 가 정의된 경우, 이 함수가 사용하는 32비트 인코딩은 UTF-32입니다. 그렇지 않으면 구현에 따라 정의됩니다. 이 매크로는 항상 정의되며 인코딩은 항상 UTF-32입니다. (C23 이후) 어떤 경우든, 이 함수가 사용하는 멀티바이트 문자 인코딩은 현재 활성화된 C 로캘에 의해 지정됩니다.
목차 |
매개변수
| pc32 | - | 결과로 생성되는 32비트 와이드 문자를 기록할 위치에 대한 포인터 |
| s | - | 입력으로 사용되는 멀티바이트 문자 문자열에 대한 포인터 |
| n | - | 검사 가능한 s 내 바이트 수에 대한 제한 |
| ps | - | 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터 |
반환값
다음 중 먼저 적용되는 항목:
-
0
s에서 변환된 문자(그리고 null이 아닌 경우 * pc32 에 저장된)가 null 문자인 경우. -
s에서 성공적으로 변환된 멀티바이트 문자의 바이트 수[1,n]. - ( size_t ) - 3 멀티- char32_t 문자에서 다음 char32_t 가 이제 * pc32 에 기록된 경우. 이 경우 입력에서 어떤 바이트도 처리되지 않습니다.
- ( size_t ) - 2 다음 n 바이트가 불완전하지만 지금까지는 유효한 멀티바이트 문자를 구성하는 경우. * pc32 에는 아무것도 기록되지 않습니다.
- ( size_t ) - 1 인코딩 오류가 발생하는 경우. * pc32 에는 아무것도 기록되지 않으며, 값 EILSEQ 가 errno 에 저장되고 * ps 의 값은 지정되지 않습니다.
예제
MSVC에서는 UTF_8이 올바르게 작동하려면
/utf-8
컴파일러 플래그가 필요합니다.
#include <assert.h> #include <locale.h> #include <stdio.h> #include <uchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" enum { in_size = sizeof in / sizeof *in }; printf("Processing %d UTF-8 code units: [", in_size); for (int i = 0; i < in_size; ++i) printf("%s%02X", i ? " " : "", (unsigned char)in[i]); puts("]"); char32_t out[in_size]; char32_t* p_out = out; char* p_in = in; char* end = in + in_size; mbstate_t state = {0}; size_t rc; while ((rc = mbrtoc32(p_out, p_in, end - p_in, &state))) { assert(rc != (size_t)-3); // no surrogate pairs in UTF-32 if (rc == (size_t)-1) break; // invalid input if (rc == (size_t)-2) break; // truncated input p_in += rc; ++p_out; } size_t out_size = p_out+1 - out; printf("into %zu UTF-32 code units: [", out_size); for (size_t i = 0; i < out_size; ++i) printf("%s%08X", i ? " " : "", out[i]); puts("]"); }
출력:
Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00] into 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000]
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 7.30.1.5 mbrtoc32 함수 (p: 410)
- C17 표준 (ISO/IEC 9899:2018):
-
- 7.28.1.3 mbrtoc32 함수 (p: 293-294)
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.28.1.3 mbrtoc32 함수 (p: 400-401)
참고 항목
|
(C11)
|
UTF-32 문자를 좁은 멀티바이트 인코딩으로 변환합니다
(함수) |
|
C++ documentation
for
mbrtoc32
|
|