[STL] 유니코드 저장/읽기

저장

wofstream 을 사용해 유니코드 문자열 저장시 멀티바이트로 컨버팅이 발생한다.(디폴트)

왜 컨버팅을 하는지는

http://stackoverflow.com/questions/1509277/why-does-wide-file-stream-in-c-narrow-written-data-by-default/

를 참조해 보면 되겠고 (명확한 답은 없지만 생각해 볼 여지는 있음)

컨버팅을 원하지 않으면

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();
}

 

참조

http://golbenge.wordpress.com/2009/12/24/stl%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-unicode-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EC%B6%9C%EB%A0%A5/

 

 

추가

vs2013 에서는 오류가 난다.

new 대신 ::new 사용..

http://stackoverflow.com/questions/9538114/utf-8-locale-in-visual-c-2010