/*************************************************************** 简单的wchar_t 和 char 转换类, 且包含与UTF8的转换(需要定义宏_UTF8_) ***************************************************************/ #ifndef __CHAR_CONVERT_H__ #define __CHAR_CONVERT_H__ #include <SDKDDKVer.h> //"targetver.h" #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息 #endif // Windows 头文件: #include <windows.h> / // 简单的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__
简单的wchar_t 和 char 转换类, 且包含与UTF8的转换
最新推荐文章于 2024-05-22 14:32:15 发布