mbrtoc16
|
헤더 파일에 정의됨
<uchar.h>
|
||
| (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)
참고 항목
|
(C11)
|
UTF-16 문자를 좁은 멀티바이트 인코딩으로 변환합니다
(함수) |
|
C++ documentation
for
mbrtoc16
|
|