/***************************************************************
简单的wchar_t 和 char 转换类,
且包含与UTF8的转换(需要定义宏_UTF8_)
***************************************************************/
#ifndef __CHAR_CONVERT_H__
#define __CHAR_CONVERT_H__
#include //"targetver.h"
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息
#endif
// Windows 头文件:
#include
/
// 简单的wchar_t 和 char 转换类, 且包含与UTF8的转换
class CWCharToChar
{
public:
enum
{
EChar = 1,
EWChar = 2,
EUtf8 = 4
};
private:
char * m_cDest;
wchar_t * m_wcDest;
char * m_cUtf8;
unsigned int m_nSrcType;
public:
char * Char(void) { return m_cDest; }
wchar_t * WChar(void){ return m_wcDest; }
#if defined( _UTF8_ )
char * UTF8(void) { return m_cUtf8; }
#endif
TCHAR * TChar(void)
{
#ifdef _UNICODE
return WChar();
#else
return Char();
#endif
}
// ANSI/GBK 转 Unicode和UTF8的构造函数
CWCharToChar(const char* psrc, unsigned int nSrcType = EChar)
: m_cDest(NULL)
, m_wcDest(NULL)
, m_cUtf8(NULL)
, m_nSrcType(nSrcType)
{
if( EChar == m_nSrcType )
{
m_cDest = (char*)psrc;
#if defined( _UTF8_ )
int nLen = MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, NULL, 0);
m_wcDest = new wchar_t[nLen];
MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, m_wcDest, nLen);
nLen = WideCharToMultiByte(CP_UTF8, 0, m_wcDest, -1, NULL, 0, NULL, NULL);
m_cUtf8 = new char[nLen + 1];
WideCharToMultiByte (CP_UTF8, 0, m_wcDest, -1, m_cUtf8, nLen, NULL,NULL);
#else
int nLen = MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, NULL, 0);
m_wcDest = new wchar_t[nLen];
MultiByteToWideChar (CP_ACP, 0, m_cDest, -1, m_wcDest, nLen);
#endif
}
else if( EUtf8 == m_nSrcType )
{
m_cUtf8 = (char*)psrc;
int nLen = MultiByteToWideChar(CP_UTF8, 0, m_cUtf8, -1, NULL,0);
m_wcDest = new wchar_t[nLen+1];
MultiByteToWideChar(CP_UTF8, 0, m_cUtf8, -1, m_wcDest, nLen);
nLen = WideCharToMultiByte(CP_ACP, 0, m_wcDest, -1, NULL, 0, NULL, NULL);
m_cDest = new char[nLen + 1];
WideCharToMultiByte(CP_ACP, 0, m_wcDest, -1, m_cDest, nLen, NULL,NULL);
}
}
// Unicode 转 ANSI/GBK和UTF8的构造函数
CWCharToChar(const wchar_t * psrc)
: m_cDest(NULL)
, m_wcDest(NULL)
, m_cUtf8(NULL)
, m_nSrcType(EWChar)
{
m_wcDest = (wchar_t*)psrc;
// ANSI/GBK
{
int nLen = WideCharToMultiByte(CP_OEMCP,NULL, m_wcDest,-1,NULL,0,NULL,FALSE);
m_cDest = new char[nLen];
WideCharToMultiByte (CP_OEMCP,NULL,m_wcDest,-1, m_cDest, nLen,NULL,FALSE);
}
#if defined( _UTF8_ )
{
int nLen = WideCharToMultiByte(CP_UTF8, 0, m_wcDest, -1, NULL, 0, NULL, NULL);
m_cUtf8 = new char[nLen + 1];
WideCharToMultiByte (CP_UTF8, 0, m_wcDest, -1, m_cUtf8, nLen, NULL,NULL);
}
#endif
}
~CWCharToChar()
{
if( EChar == m_nSrcType )
{
if( m_wcDest ) delete [] m_wcDest;
if( m_cUtf8 ) delete [] m_cUtf8;
}
else if( EWChar == m_nSrcType )
{
if( m_cDest ) delete [] m_cDest;
if( m_cUtf8 ) delete [] m_cUtf8;
}
else if( EUtf8 == m_nSrcType )
{
if( m_cDest ) delete [] m_cDest;
if( m_wcDest ) delete [] m_wcDest;
}
}
};
#endif //__CHAR_CONVERT_H__