Namespaces
Variants

mbrtoc16

From cppreference.net
헤더 파일에 정의됨 <uchar.h>
size_t mbrtoc16 ( char16_t * restrict pc16, const char * restrict s,
size_t n, mbstate_t * restrict ps ) ;
(C11 이후)

단일 코드 포인트를 좁은 멀티바이트 문자 표현에서 가변 길이 16비트 와이드 문자 표현(일반적으로 UTF-16)으로 변환합니다.

만약 s 가 null 포인터가 아니라면, 최대 n 바이트까지의 멀티바이트 문자 문자열을 검사하여(현재 멀티바이트 변환 상태 * ps 를 고려하며, 시프트 시퀀스를 포함하여) s 가 가리키는 바이트부터 시작해 다음 멀티바이트 문자를 완성하는 데 필요한 바이트 수를 결정합니다. 만약 함수가 s 에 있는 다음 멀티바이트 문자가 완전하고 유효하다고 판단하면, 이를 해당하는 16비트 와이드 문자로 변환하여 * pc16 에 저장합니다( pc16 이 null이 아닌 경우).

만약 * s 의 멀티바이트 문자가 다중 char16_t 시퀀스(예: UTF-16의 서로게이트 페어)에 해당하는 경우, 이 함수의 첫 번째 호출 후 * ps mbrtoc16 의 다음 호출이 추가 char16_t 를 출력하도록 업데이트되며, 이때 * s 를 고려하지 않습니다.

만약 s 가 널 포인터인 경우, n pc16 의 값은 무시되며, 이 호출은 mbrtoc16 ( NULL , "" , 1 , ps ) 와 동일합니다.

생성된 와이드 문자가 널 문자인 경우, 변환 상태 * ps 는 초기 시프트 상태를 나타냅니다.

매크로 __STDC_UTF_16__ 가 정의된 경우, 이 함수가 사용하는 16비트 인코딩은 UTF-16입니다. 그렇지 않으면 구현에 따라 정의됩니다. 이 매크로는 항상 정의되며 인코딩은 항상 UTF-16입니다. (C23 이후) 어떤 경우든, 이 함수가 사용하는 멀티바이트 문자 인코딩은 현재 활성화된 C 로캘에 의해 지정됩니다.

목차

매개변수

pc16 - 결과로 생성되는 16비트 와이드 문자를 기록할 위치에 대한 포인터
s - 입력으로 사용되는 멀티바이트 문자 문자열에 대한 포인터
n - 검사할 수 있는 s의 바이트 수 제한
ps - 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터

반환값

다음 중 먼저 적용되는 항목:

  • 0 s 에서 변환된 문자(그리고 null이 아닌 경우 * pc16 에 저장된)가 null 문자인 경우.
  • s 에서 성공적으로 변환된 멀티바이트 문자의 바이트 수 [ 1 , n ] .
  • ( size_t ) - 3 다중 char16_t 문자(예: 서로게이트 쌍)의 다음 char16_t 가 이제 * pc16 에 기록된 경우. 이 경우 입력에서 어떤 바이트도 처리되지 않습니다.
  • ( size_t ) - 2 다음 n 바이트가 불완전하지만 지금까지 유효한 멀티바이트 문자를 구성하는 경우. * pc16 에는 아무것도 기록되지 않습니다.
  • ( size_t ) - 1 인코딩 오류가 발생하는 경우. * pc16 에는 아무것도 기록되지 않으며, EILSEQ 값이 errno 에 저장되고 * ps 의 값은 지정되지 않습니다.

예제

MSVC에서는 UTF_8이 제대로 작동하려면 /utf-8 컴파일러 플래그가 필요할 수 있습니다.

#include <locale.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    enum { in_sz = sizeof in / sizeof *in };
    printf("Processing %d UTF-8 code units: [", in_sz);
    for (int n = 0; n < in_sz; ++n)
        printf("%s%02X", n ? " " : "", (unsigned char)in[n]);
    puts("]");
    char16_t out[in_sz];
    const char* p_in = in;
    const char* end = in + in_sz;
    char16_t* p_out = out;
    mbstate_t state = {0};
    for (size_t rc; (rc = mbrtoc16(p_out, p_in, end - p_in, &state));)
    {
        if (rc == (size_t)-1)     // invalid input
            break;
        else if(rc == (size_t)-2) // truncated input
            break;
        else if(rc == (size_t)-3) // UTF-16 high surrogate
            p_out += 1;
        else
        {
            p_in += rc;
            p_out += 1;
        };
    }
    const size_t out_sz = p_out - out + 1;
    printf("into %zu UTF-16 code units: [", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%s%04X", x ? " " : "", out[x]);
    puts("]");
}

출력:

Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
into 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.30.1.3 mbrtoc16 함수 (p: 408-409)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.28.1.1 mbrtoc16 함수 (p: 398-399)

참고 항목

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