宽字符与窄字符的转换

最近在看opencv,无奈老外开发的东西TMD居然没有宽字符版本。
比如一个最简单的读取位图文件的

Mat imread( const string& filename, int flags=1 );

MSDN对转换宏介绍的不清不楚的,看源文件吧

/*atlconv.h*/
#ifdef _UNICODE

#define CT2A CW2A

#else  // !_UNICODE

/*
CT2A 被替换成CW2A  CW2A实际是一个类
CString  Wstr(_T("this is a unicode string"));
那么假如 CT2A  str(Wstr);_CString重载了return LPCWSTR,因此是可以这样传递参数构造的_

就构造了一个CW2A对象,这个对象str包含一个成员LPSTR m_psz;
这个指针即转换后的窄字符buffer  指针,同样的,这个类也重载了return LPSTR,因此可以这样用

char* exo=str(Wstr);
*/
class CW2AEX
{
public:
    CW2AEX(_In_z_ LPCWSTR psz) throw(...) :
        m_psz( m_szBuffer )
    {
        Init( psz, _AtlGetConversionACP() );
    }
    CW2AEX(
            _In_z_ LPCWSTR psz, 
            _In_ UINT nCodePage) throw(...) :
        m_psz( m_szBuffer )
    {
        Init( psz, nCodePage );
    }
    ~CW2AEX() throw()
    {       
        AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
    }

    _Ret_z_ operator LPSTR() const throw()
    {
        return( m_psz );
    }

private:
    void Init(
        _In_z_ LPCWSTR psz, 
        _In_ UINT nConvertCodePage) throw(...)
    {
        if (psz == NULL)
        {
            m_psz = NULL;
            return;
        }
        int nLengthW = lstrlenW( psz )+1;        
        int nLengthA = nLengthW*4;

        AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);

        BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL ));
        if (bFailed)
        {
            if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
            {
                nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, NULL, 0, NULL, NULL );
                AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
                bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL ));
            }           
        }
        if (bFailed)
        {
            AtlThrowLastWin32();
        }
    }

public:
    LPSTR m_psz;
    char m_szBuffer[t_nBufferLength];

private:
    CW2AEX(_In_ const CW2AEX&) throw();
    CW2AEX& operator=(_In_ const CW2AEX&) throw();
};
typedef CW2AEX<> CW2A;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值