이 글에서는 C++의 와이드 문자(wide character)가 무엇인지 살펴보고, 와이드 문자를 다룰 때 유용하게 사용되는 대표적인 라이브러리 함수들을 함께 알아보겠습니다.
와이드 문자란 무엇인가?
와이드 문자는 일반적인 char 자료형과 매우 유사하지만, 결정적인 차이점이 있습니다. 일반 char는 메모리에서 1바이트를 차지하는 반면, 와이드 문자(wchar_t)는 2바이트(컴파일러에 따라 4바이트)의 공간을 사용합니다.
2바이트 공간을 활용하면 최대 64K(65,536)개의 서로 다른 문자를 표현할 수 있으며, 이를 통해 유니코드(UNICODE) 문자를 저장할 수 있습니다. 유니코드는 사실상 모든 언어의 거의 모든 문자를 인코딩할 수 있도록 설계된 국제 표준입니다.
와이드 문자 기본 예제
#include<iostream>
using namespace std;
int main() {
wchar_t wide_character = L'a';
cout << "The wide character is: " << wide_character << endl;
cout << "Wide character size: " <<sizeof(wide_character);
}실행 결과
The wide character is: 97 Wide character size: 2
위 예제에서 확인할 수 있듯이, 와이드 문자 리터럴을 만들려면 문자 앞에 'L' 접두사를 붙여야 합니다. 또한 중요한 점은 일반 cout으로는 와이드 문자 값이 제대로 출력되지 않는다는 것입니다. 따라서 와이드 문자를 출력할 때는 wcout, 입력받을 때는 wcin을 사용해야 합니다.
와이드 문자 배열 다루기
와이드 문자 배열을 만들어 문자열처럼 출력할 수도 있습니다.
#include<iostream>
using namespace std;
int main() {
char str1[] = "This is character array";
cout << str1 << endl;
wchar_t str2 [] = L"This is wide character array";
wcout << str2;
}실행 결과
This is character array This is wide character array
와이드 문자 처리를 위한 주요 라이브러리 함수
C++ 표준 라이브러리는 와이드 문자열을 조작하기 위한 다양한 함수를 제공합니다. 일반 문자열 함수(strlen, strcpy 등)와 이름과 용도가 거의 같으며, 'str' 대신 'wcs'라는 접두사만 다릅니다.
| 함수 | 설명 |
|---|---|
| wcslen() | 구문: size_t wcslen(const wchar_t* wcs);와이드 문자열의 길이를 반환합니다. |
| wcscat() | 구문: wchar_t *wcscat(wchar_t *strDest, const wchar_t *strSrc);원본 문자열(strSrc)을 대상 문자열(strDest) 끝에 연결합니다. |
| wcscpy() | 구문: wchar_t *wcscpy(wchar_t *strDest, const wchar_t *strSrc);원본 문자열을 대상 문자열로 복사합니다. |
| wcsncpy() | 구문: wchar_t* wcsncpy(wchar_t* dest, const wchar_t* src, size_t n);원본 문자열의 처음 n개 문자를 대상으로 복사합니다. 원본 문자열의 길이가 n보다 짧으면, 남는 부분은 널(null) 문자로 채워집니다. |
| wcscmp() | 구문: int wcscmp(const wchar_t* wcs1, const wchar_t* wcs2);두 와이드 문자열 wcs1과 wcs2를 비교합니다. 일반 문자열 비교에 사용되는 strcmp()와 동일한 역할을 합니다. |
| wcsstr() | 구문: const wchar_t* wcsstr(const wchar_t* wcs1, const wchar_t* wcs2);wcs1 내에서 wcs2가 처음 나타나는 위치를 찾습니다. 찾지 못하면 null을 반환합니다. |
| wcstok() | 구문: wchar_t* wcstok(wchar_t* str, const wchar_t* delim, wchar_t **ptr);strtok()와 유사한 함수로, 구분자(delim)를 기준으로 와이드 문자열을 토큰 단위로 분리합니다. |
마무리
와이드 문자는 다국어 지원이나 유니코드 기반 텍스트 처리가 필요한 프로그램에서 필수적인 요소입니다. 일반 문자열 함수와 대응되는 wcs 계열 함수들의 사용법만 익혀두면, 기존 문자열 처리 경험을 그대로 와이드 문자열에 적용할 수 있습니다.