Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++ mbrtowc() 함수 완벽 정리: 멀티바이트 문자열을 와이드 문자로 변환하기

mbrtowc() 함수는 C/C++에서 멀티바이트(multibyte) 문자 시퀀스를 와이드 문자(wide character)로 변환하는 데 사용되는 표준 라이브러리 함수입니다. 함수 이름에서 알 수 있듯이 'multibyte restartable to wide character'의 약자로, 변환 상태(conversion state)를 유지하면서 멀티바이트 문자열을 하나씩 안전하게 해석할 수 있다는 특징이 있습니다.

이 함수는 성공적으로 변환된 멀티바이트 문자가 차지하는 바이트 수를 반환합니다. 기본 문법은 다음과 같습니다.

mbrtowc (wchar_t* wc, const char* s, size_t max, mbstate_t* ps)

매개변수 설명

  • wc : 변환 결과로 얻어진 와이드 문자가 저장될 위치를 가리키는 포인터입니다.
  • s : 입력으로 사용할 멀티바이트 문자열을 가리키는 포인터입니다.
  • max : 문자열 s에서 검사할 수 있는 최대 바이트 수입니다.
  • ps : 멀티바이트 문자열을 해석할 때 사용되는 변환 상태(conversion state)를 가리키는 포인터입니다.

사용 예제

아래 예제는 UTF-8로 인코딩된 문자열을 mbrtowc()를 이용해 한 글자씩 순회하면서, 각 문자가 몇 바이트로 구성되어 있는지 출력하는 코드입니다.

#include <bits/stdc++.h>
using namespace std;
void display(const char* s) {
    mbstate_t ps = mbstate_t(); // 초기 변환 상태
    int s_len = strlen(s);
    const char* n = s + s_len;
    int len;
    wchar_t wide_char;
    while ((len = mbrtowc(&wide_char, s, n - s, &ps)) > 0) {
        wcout << "다음 " << len << "바이트는 문자 " << wide_char << "에 해당합니다" << '\n';
        s += len;
    }
}
main() {
    setlocale(LC_ALL, "en_US.utf8");
    const char* str = u8"z\u00cf\u7c38\U00000915";
    display(str);
}

실행 결과

다음 1바이트는 문자 z에 해당합니다
다음 2바이트는 문자 Ï에 해당합니다
다음 3바이트는 문자 簸에 해당합니다
다음 3바이트는 문자 क에 해당합니다

핵심 포인트

위 실행 결과에서 확인할 수 있듯이, UTF-8 인코딩에서는 문자마다 차지하는 바이트 수가 다릅니다. 영문자 'z'는 1바이트, 특수 기호 'Ï'는 2바이트, 한자 '簸'와 데바나가리 문자 'क'는 각각 3바이트를 사용합니다. mbrtowc()는 이처럼 가변 길이 인코딩을 올바르게 처리해 주기 때문에, 국제화(i18n)를 지원하는 프로그램에서 멀티바이트 문자열을 다룰 때 매우 유용한 함수입니다. 또한 mbstate_t 객체를 통해 변환 상태를 관리하므로, 여러 개의 독립적인 문자열을 동시에 처리하는 재시작 가능(restartable) 방식의 안전한 변환이 가능합니다.