Namespaces
Variants

mbrtoc32

From cppreference.net
헤더 파일에 정의됨 <uchar.h>
size_t mbrtoc32 ( char32_t restrict * pc32, const char * restrict s,
size_t n, mbstate_t * restrict ps ) ;
(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)

참고 항목

UTF-32 문자를 좁은 멀티바이트 인코딩으로 변환합니다
(함수)
C++ documentation for mbrtoc32