문자열 변환

멀티바이트간 문자열 변환

Ansi, UTF7, UTF8 간 문자열 변환은 wide character 로 한번 변환된 뒤 다시 multi byte 로 변환되는 수고스러움을 거쳐야 한다.

이 과정을 간단하게 해주는 클래스를 만들어 보았다.

#ifndef __MULTIBYTE_CONVERTER__
#define __MULTIBYTE_CONVERTER__
 
 
#include <stringapiset.h>
#include <stdexcept>
 
 
class MultiByteConverter
{
public:
	MultiByteConverter( const char* pSrc, int nSrcCP, int nDstCP )
		:
		m_pBuffer( NULL )
	{
		// check validation
		if ( nSrcCP == nDstCP )
			throw std::logic_error( "same code page." );
 
		// convert to wide character
		int nNum = ::MultiByteToWideChar( nSrcCP, 0, pSrc, -1, NULL, NULL );
		WCHAR* szWCS = new WCHAR[ nNum ];
		if ( !szWCS )
			throw std::logic_error( "cannot allocate memory anymore." );
		if ( nNum != ::MultiByteToWideChar( nSrcCP, 0, pSrc, -1, szWCS, nNum ) )
			throw std::logic_error( "failed MultiByteToWideChar call." );
 
		// convert to multi byte character
		nNum = ::WideCharToMultiByte( nDstCP, 0, szWCS, -1, NULL, NULL, NULL, NULL );
		m_pBuffer = new char[ nNum ];
		if ( !m_pBuffer )
			throw std::logic_error( "cannot allocate memory anymore." );
		if ( nNum != ::WideCharToMultiByte( nDstCP, 0, szWCS, -1, m_pBuffer, nNum, NULL, NULL ) )
			throw std::logic_error( "failed WideCharToMultiByte call." );
 
		delete [] szWCS;
	}
 
	~MultiByteConverter()
	{
		if ( m_pBuffer )
		{
			delete [] m_pBuffer;
			m_pBuffer = NULL;
		}
	}
 
	const char* operator * ()
	{
		return m_pBuffer;
	}
 
private:
	char*	m_pBuffer;
};
 
 
#define _AtoU8( str )	*MultiByteConverter( str, CP_ACP, CP_UTF8 )
#define _U8toA( str )	*MultiByteConverter( str, CP_UTF8, CP_ACP )
 
 
#endif  // __MULTIBYTE_CONVERTER__

사용법은 간단하다. ansi 에서 utf8 로 바꾸고 싶으면 _AtoU8( “utf8 로” ) 를 하면 되고

utf8 에서 ansi 로 바꾸고 싶으면 _U8toA( “ansi 로” ) 를 하면 된다.

boost 를 사용한 문자열 변환