-
#include <iostream>
-
#include <stdio.h>
-
#include <locale>
-
-
using namespace std;
-
typedef __enc_traits enc_type;
-
typedef codecvt<wchar_t, char, enc_type> unicode_codecvt;
-
typedef codecvt_base::result result;
-
typedef wchar_t int_type;
-
typedef char ext_type;
-
typedef __gnu_cxx::char_traits<int_type> int_traits;
-
-
int main(void)
-
{
-
locale loc(locale::classic(), new unicode_codecvt);
-
if (!has_facet<unicode_codecvt>(loc)) {
-
cerr << "don’t have facet" << endl;
-
return -1;
-
}
-
const unicode_codecvt* cvt = &use_facet<unicode_codecvt>(loc);
-
unicode_codecvt::state_type state01("UCS4", "UHC");
-
if (state01._M_good() == false) {
-
cerr << "can’t make state" << endl;
-
return -1;
-
}
-
state01._M_init();
-
-
const ext_type* e_lit = "쒝 슌 꽌";
-
const ext_type* e_lit2 = "시냇물 처졸 냇";
-
const ext_type* efrom_next;
-
int_type* i_arr = new int_type[1024];
-
int_type* ito_next;
-
result r1;
-
-
int size = strlen(e_lit);
-
int size2 = strlen(e_lit2);
-
-
r1 = cvt->in(state01, e_lit, e_lit + size, efrom_next,
-
i_arr, i_arr + size, ito_next);
-
if (r1 != codecvt_base::ok)
-
return -1;
-
for (int i = 0; i < size && i_arr[i]; ++i) {
-
if (i_arr[i] == 0×20000000) {
-
} else {
-
}
-
}
-
cout << endl;
-
-
r1 = cvt->in(state01, e_lit2, e_lit2 + size2, efrom_next,
-
i_arr, i_arr + size2, ito_next);
-
if (r1 != codecvt_base::ok)
-
return -1;
-
for (int i = 0; i < size2 && i_arr[i]; ++i) {
-
if (i_arr[i] == 0×20000000) {
-
} else {
-
}
-
}
-
cout << endl;
-
-
return 0;
-
}
실행 결과는 다음과 같다. 각각의 글자가 제대로 된 UCS4 워드값을 가지고 있음을 볼 수 있다.
0×9DC40000 // 쒝
0×8CC20000 // 슌
0×4CAF0000 // 꽌
0xDCC20000 // 시
0xC7B00000 // 냇
0×3CBB0000 // 물0×98CC0000 // 처
0×78C80000 // 졸0xC7B00000 // 냇
codecvt 대신에 mbstowcs()를 사용하게 되면 완성형 문자집합의 범위를 넘어서는 확장완성형 코드의 경우 ‘?’로 변환되어 ‘쒝’, ‘슌’, ‘꽌’ 등의 글자가 모두 같은 워드값을 가지게 되는 문제점이 나타난다.
다만 위 소스코드의 한 가지 아쉬운 점은 locale 설정, codecvt 생성, state 생성을 초기화하는 별개 함수로 분리할 수 없다는 점이다. state를 포인터나 레퍼런스로 넘기게 되면 cvt의 in() 메쏘드를 호출할 때 내부에서 segmentation fault가 발생한다. 아직 해결책을 찾지 못하고 같은 함수에서 사용하는 방법을 사용하고 있다.
<출처 : http://terzeron.net/wp/?p=733 >