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

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

이 글에서는 C++ STL의 std::mbsrtowcs() 함수의 동작 원리, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다.

std::mbsrtowcs()란 무엇인가?

std::mbsrtowcs()는 C++ STL에 내장된 함수로, <cwchar> 헤더 파일에 정의되어 있습니다. 함수 이름에서 알 수 있듯이, mbsrtowcs(multibyte string restartable to wide character string)는 *src가 가리키는 널(null)로 종료되는 멀티바이트 문자열을 와이드(wide) 문자 표현으로 변환하는 역할을 합니다. 이 함수는 변환 결과에 따라 적절한 값을 반환하며, 재시작 가능(restartable) 방식으로 동작하기 때문에 변환 상태를 mbstate_t 객체를 통해 유지할 수 있다는 특징이 있습니다.

문법

size_t mbsrtowcs( wchar_t* pwc, char** str, size_t n, mbstate_t* ps);

매개변수

이 함수는 다음과 같은 매개변수를 받습니다.

  • pwc − 변환 결과(와이드 문자열)를 저장할 메모리 위치를 가리키는 포인터입니다.
  • str − 입력으로 사용되는 멀티바이트 문자열에 대한 포인터입니다. 변환이 진행됨에 따라 이 포인터는 처리된 위치로 갱신됩니다.
  • n − 검사하고 변환할 최대 바이트 수입니다.
  • ps − 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체(mbstate_t)를 가리키는 포인터입니다.

반환 값

이 함수는 아래 조건에 따라 서로 다른 값을 반환합니다.

  • 0 − str에서 변환해야 할 문자가 NULL인 경우, 즉 빈 문자열인 경우 0을 반환합니다.
  • 1…n − 성공적으로 변환되어 *str에 저장된 널 종료 문자를 포함한 와이드 문자의 개수입니다.
  • -1 − 변환 과정에서 오류가 발생한 경우 반환되며, 이때 errno가 EILSEQ로 설정됩니다. 잘못된 멀티바이트 시퀀스를 만났다는 의미입니다.

예제 1: 기본적인 멀티바이트 → 와이드 문자 변환

#include <bits/stdc++.h>
using namespace std;
int main(){
    setlocale(LC_ALL, "en_US.utf8");
    const char* ch = "\u0777\u0755";
    wchar_t arr[20];
    mbstate_t hold = mbstate_t();
    int highest = 10;
    int val = mbsrtowcs ( arr, &ch, highest, &hold );
    wcout << L"Wide characters are: "<< val << endl;
    wcout << L"Given Wide character is: " << arr << endl;
    return 0;
}

출력 결과

Wide characters are: 2
Given Wide character is: ݷݕ

위 예제에서는 두 개의 특수 문자(ݷ, ݕ)로 구성된 멀티바이트 문자열을 와이드 문자 배열로 변환했습니다. 변환된 와이드 문자의 총 개수는 2개이며, 각 문자가 정상적으로 배열에 저장된 것을 확인할 수 있습니다.

예제 2: UTF-8 인코딩 문자열 변환

#include <bits/stdc++.h>
using namespace std;
int main() {
   setlocale(LC_ALL, "en_US.utf8");
   const char* ch = u8"z\u00df\u6c34";
   wchar_t arr[20];
   mbstate_t hold = mbstate_t();
   int highest = 10;
   int val = mbsrtowcs ( arr, &ch, highest, &hold );
   wcout << L"Total Wide characters are: "<< val << endl;
   wcout << L"Given Wide character is: " << arr << endl;
   return 0;
}

출력 결과

Total Wide characters are: 3
Given Wide character is: zß水

두 번째 예제에서는 UTF-8로 인코딩된 문자열("z", "ß", "水")을 와이드 문자열로 변환했습니다. 라틴 문자, 독일어 특수 문자, 한자 등 서로 다른 문자들이 모두 올바르게 변환되어 총 3개의 와이드 문자가 출력되었습니다.

정리

mbsrtowcs() 함수는 멀티바이트 문자열과 와이드 문자열 간의 변환이 필요한 국제화(i18n) 프로그래밍에서 매우 유용하게 활용됩니다. 특히 로캘(locale) 설정에 따라 다양한 언어의 문자를 처리해야 하는 경우, 이 함수를 사용하면 안전하고 효율적으로 문자열 변환을 수행할 수 있습니다. 단, 변환 오류(EILSEQ)에 대한 예외 처리를 반드시 고려해야 하며, 출력 버퍼 크기도 충분히 확보해야 안전한 코드를 작성할 수 있습니다.