[STL] 유니코드 저장/읽기
As a developer/C/C++ 2013. 3. 11. 16:55
저장
wofstream 을 사용해 유니코드 문자열 저장시 멀티바이트로 컨버팅이 발생한다.(디폴트)
왜 컨버팅을 하는지는
를 참조해 보면 되겠고 (명확한 답은 없지만 생각해 볼 여지는 있음)
컨버팅을 원하지 않으면
class Unicodecvt : public std::codecvt<wchar_t, char, mbstate_t>
{
protected:
virtual bool do_always_noconv() const
{
return true;
}
};
};
클래스를 정의해 놓고 아래처럼 wof에 속성을 추가로 부여한다.
std::ios_base::binary 옵션을 꼭 지정하자!
std::wofstream wof(szPath, std::ios_base::binary);
wof.imbue( std::locale(std::locale(""), new Unicodecvt) );
if( wof.is_open() )
{
wof << WCHAR(0xFEFF);
wof << WriteBuffer...;
wof.close();
}
결과를 보면 유니코드로 변환없이 저장이 되어있다.
읽기
유니코드 파일을 wifstream 을 통해 읽으면 문자열 버퍼를 멀티바이트로 인식해 유니코드로 변환이 일어난다.
쓰기와 마찬가지로 변환 옵션을 꺼 주고 바이너리 형태로 읽어야 한다.
std::wifstream in_stream(szPath, std::ios_base::binary);
in_stream.imbue( std::locale(std::locale(""), new Unicodecvt) );
if(!in_stream)
{
// err
}
std::wstring strBuf;
if( in_stream.is_open() )
{
in_stream.seekg(2);
while( !in_stream.eof() )
{
WCHAR buf[2048] = {0,};
in_stream.getline((WCHAR*)buf, _countof(buf));
// output buf
}
in_stream.close();
}
참조
추가
vs2013 에서는 오류가 난다.
new 대신 ::new 사용..
http://stackoverflow.com/questions/9538114/utf-8-locale-in-visual-c-2010