C/C++의 c32rtomb() 함수란?
C++에서는 char32_t 타입으로 표현되는 32비트 문자(UTF-32)를 다룰 수 있습니다. 이때 c32rtomb() 함수는 32비트 문자 표현을 좁은(narrow) 멀티바이트 문자 표현으로 변환하는 역할을 담당합니다. 이 함수는 uchar.h 헤더 파일에 선언되어 있으며, C11 표준부터 도입된 유니코드 변환 함수 중 하나입니다.
c32rtomb() 함수의 매개변수
이 함수는 다음과 같이 세 개의 매개변수를 받습니다.
- 변환 결과를 저장할 버퍼 : 멀티바이트 문자가 저장될 문자 배열
- 변환할 32비트 문자 : char32_t 타입의 유니코드 문자
- mbstate_t 객체의 포인터 : 멀티바이트 문자열을 올바르게 해석하기 위해 변환 상태를 추적하는 객체
반환값
함수가 성공적으로 실행되면 문자 배열에 기록된 바이트 수를 반환하고, 변환에 실패하면 -1을 반환합니다. 따라서 호출 후 반환값을 반드시 검사해야 안전하게 사용할 수 있습니다.
예제 코드
다음 예제는 U"Hello World"라는 UTF-32 문자열을 한 글자씩 c32rtomb() 함수로 변환하여 출력하는 프로그램입니다.
#include <iostream>
#include <uchar.h>
#include <wchar.h>
using namespace std;
int main() {
const char32_t myStr[] = U"Hello World";
char dest[50];
mbstate_t p{};
size_t length;
int j = 0;
while (myStr[j]) {
length = c32rtomb(dest, myStr[j], &p); // c32rtomb()로 변환된 길이를 얻음
if ((length == 0) || (length > 50))
break;
for (int i = 0; i < length; ++i)
cout << dest[i];
j++;
}
}위 코드에서 mbstate_t 객체인 p는 문자 사이의 변환 상태를 유지하는 역할을 합니다. 반복문 안에서 문자열을 한 글자씩 변환하고, 반환된 길이(length)만큼만 dest 배열에서 읽어 화면에 출력합니다. 만약 변환 결과가 비정상적이거나 버퍼 크기를 초과하면 루프를 종료하도록 처리했습니다.
실행 결과
Hello World
이처럼 c32rtomb() 함수를 활용하면 UTF-32 기반의 유니코드 문자열을 환경에 맞는 멀티바이트 인코딩(예: UTF-8)으로 손쉽게 변환할 수 있습니다. 국제화(i18n) 작업이나 다국어 문자열 처리 시 유용하게 사용할 수 있는 함수입니다.