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


/***************************************************************

    简单的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__










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值