简单的wchar_t 和 char 转换类, 且包含与UTF8的转换

来源:互联网 发布:代理服务器端口 编辑:程序博客网 时间:2024/05/16 07:16
/***************************************************************    简单的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__


	
				
		
原创粉丝点击