이 글에서는 C++ STL에서 제공하는 std::mbrtoc16() 함수의 동작 원리, 문법 그리고 실제 사용 예제를 자세히 살펴보겠습니다.
std::mbrtoc16()란 무엇인가?
std::mbrtoc16()은 C++ STL에 내장된 함수로, <cuchar> 헤더 파일에 정의되어 있습니다. 이 함수는 좁은(narrow) 멀티바이트 문자를 UTF-16 문자 표현으로 변환하는 데 사용됩니다.
연관된 문자 포인터가 NULL이 아니고 나머지 매개변수들도 올바르게 전달되면, 해당 문자에 대응하는 16비트 문자로 변환을 수행합니다.
문법
size_t mbrtoc16( char16_t* pc16, char* str, size_t n, mbstate_t* ps);
매개변수
이 함수는 다음과 같은 매개변수를 받습니다.
- pc16 − 변환 결과를 저장할 위치를 가리키는 포인터입니다.
- str − 입력으로 사용되는 문자열입니다.
- n − 검사할 바이트 수입니다.
- ps − 멀티바이트 문자열을 해석할 때 사용되는 상태 객체(state object)를 가리키는 포인터입니다.
반환값
이 함수는 아래 조건에 따라 서로 다른 값을 반환합니다.
- 0 − 변환해야 할 str 내의 문자가 NULL(널 문자)인 경우 반환됩니다.
- 1…n − 문자열 *str에서 변환된 멀티바이트 문자의 바이트 수입니다.
- -3 − 서러게이트 쌍(surrogate pair)이 존재하는 경우, 즉 char16_t 값이 여러 개의 char16_t로 구성된 경우 반환됩니다. 이때 입력으로부터 생성되는 바이트는 없습니다.
- -2 − 다음 n바이트가 불완전하지만 지금까지의 데이터는 유효한 멀티바이트 문자일 때 반환됩니다.
- -1 − 인코딩 오류가 발생한 경우 반환되며, 이때는 *pc16에 아무것도 기록되지 않습니다.
예제
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <uchar.h>
#include <wchar.h>
using namespace std;
int main(void){
char16_t hold;
char str[] = "I";
mbstate_t arr{};
int len;
// 함수 초기화 및 호출
len = mbrtoc16(&hold, str, MB_CUR_MAX, &arr);
if (len < 0) {
perror("conversion failed");
exit(-1);
}
cout << "String is: " << str << endl;
cout << "Length is: " << len << endl;
printf("16-bit character = 0g%02hd\n", hold);
}
실행 결과
String is: I Length is: 1 16-bit character = 0g73