개발 라이브러리 & 툴

boost locale을 이용한 C++에서의 Multi Byte와 UTF8간의 문자열 변환

하늘흐늘 2021. 11. 19. 11:08
반응형

영문만 있는 경우는 문자열은 C/C++에서 UTF-8로 별도의 변환을 필요로 하지 않습니다. 하지만 한글과 같이 멀티 바이트를 사용하는 경우는 별도로 UTF-8로 인코딩 및 디코딩을 해주어야 합니다. 이런 경우 사용할 수 있는 라이브러리가 boost local입니다.

간단한 Multi Byte와 UTF8간의 문자열 변환 예제는 아래와 같습니다.

#include <iostream>
#include <string>
#include <boost/locale.hpp>

using namespace std;


int main(int argc, char* argv[])
{
	string str = "{\"name\": {\"first\":\"그레이스\", \"last\":\"Hopper\"}}";
	cout << str << endl;

	string str_to_utf8 = boost::locale::conv::to_utf<char>(str, "EUC-KR");
	cout << str_to_utf8 << endl;

	string str_from_utf8 = boost::locale::conv::from_utf<char>(str_to_utf8, "EUC-KR");
	cout << str_from_utf8 << endl;

	return 0;
}

실행 결과는 아래와 같습니다. 결과의 두번째 줄은 utf-8로 인코딩된 문자열을 출력한 것입니다.

{"name": {"first":"그레이스", "last":"Hopper"}}
{"name": {"first":"洹몃젅?댁뒪", "last":"Hopper"}}
{"name": {"first":"그레이스", "last":"Hopper"}}

사용법은 간단히 멀티바이트를 utf-8로 인코딩 하기 위하여 conv::to_utf를 사용합니다. 반대로 utf-8에서 멀티바이트로 디코딩 하기 위해서는 conv::from_utf를 사용합니다. 참고로 멀티바이트 인코딩 및 디코딩에서 CPC-949와 같은 윈도우 표준은 지원하지 않는 듯 보입니다. 

그 외에 utf-16으로 인코딩하기 위해서는 to_utf와 from_utf의 인자를 char에서 wchar_t로 변경하여 주면 됩니다.

이 글은 boost::locale::conv을 참조하였습니다.

반응형