zoukankan      html  css  js  c++  java
  • CString、TCHAR*、char*转换

    发现W2A和A2W的转换有超过256k的时候会报错的问题
    char*、TCHAR*转换CString 
    CString str(****) 
    下面详细写一下其它转换 
    ////////////////////////////// 
    /* 
    *********************************************************************** 
    * 函数: TransCStringToTCHAR 
    * 描述:将CString 转换为 TCHAR* 
    * 日期:
    *********************************************************************** 
    */ 
    TCHAR* CPublic::CString2TCHAR(CString &str) 
    { 
    int iLen = str.GetLength(); 
    TCHAR* szRs = new TCHAR[iLen]; 
    lstrcpy(szRs, str.GetBuffer(iLen)); 
    str.ReleaseBuffer(); 
    return szRs; 
    } 
    
    /* 
    *********************************************************************** 
    * 函数: TCHAR2Char 
    * 描述:将TCHAR* 转换为 char* 
    * 日期:
    *********************************************************************** 
    */ 
    char* TCHAR2char(TCHAR* tchStr) 
    { 
    int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 
    char* chRtn = new char[iLen+1] 
    wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值 
    return chRtn; 
    } 
    
    /*
    *********************************************************************** 
    * 函数: char2tchar
    * 描述:将 char* 转换为 TCHAR*
    * 日期:
    *********************************************************************** 
    */ 
    TCHAR *char2tchar(char *str)
    {
    int iLen = strlen(str);
    TCHAR *chRtn = new TCHAR[iLen+1];
    mbstowcs(chRtn, str, iLen+1); return chRtn;
    }
    
    /* 
    *********************************************************************** 
    * 函数: CString2char 
    * 描述:将CString转换为 char* 
    * 日期:
    *********************************************************************** 
    */ 
    char* CPublic::CString2char(CString &str) 
    { 
    int len = str.GetLength(); 
    char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度 
    memset(chRtn, 0, 2*len+1); 
    USES_CONVERSION; 
    strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer())); 
    return chRtn; 
    } 
    //参考 
    /////////////////////// 
    //Pocket PC上的UNICODE和ANSI字符串 
    
    //By Vassili Philippov, September 26, 2001. 
    
    //杨方思歧 译 
    //////////////////////// 
    /* 
    *********************************************************************** 
    * 函 数 名:GetAnsiString 
    * 描 述:将CString(unicode)转换为char*(ANSI) 
    * 参 数:CString &s 要转换的CString 
    * 返 回 值:返回转换结果 
    * 创建日期:
    * 最后修改:
    *********************************************************************** 
    */ 
    char* GetAnsiString(const CString &s) 
    { 
    int nSize = 2*s.GetLength(); 
    char *pAnsiString = new char[nSize+1]; 
    wcstombs(pAnsiString, s, nSize+1); 
    return pAnsiString; 
    } 
    
    //////////////////////////////////////////////////////////////////////////////////////////////
         WideCharToMultiByte和MultiByteToWideChar函数的用法
    
    支持Unicode编码,需要多字节与宽字节之间的相互转换
    
    WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
    
    MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
    
    常用的代码页由CP_ACP和CP_UTF8两个。
    
    使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
    
    使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
    
    
    wstring AnsiToUnicode(( const string& str )
    {
    int   len = 0;
    
    len = str.length();
    
    int   unicodeLen = ::MultiByteToWideChar( CP_ACP, 0, str.c_str(),-1,NULL,0 );  
    
    wchar_t *   pUnicode;  
    
    pUnicode = new   wchar_t[unicodeLen+1];  
    
    memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
    
    ::MultiByteToWideChar( CP_ACP,0, str.c_str(),-1, (LPWSTR)pUnicode, unicodeLen );  
    
    wstring   rt;  
    rt = ( wchar_t* )pUnicode;
    delete   pUnicode; 
    return   rt;  
    
    }
    
    string UnicodeToAnsi( const wstring& str )
    {
    
    char*      pElementText;
    int     iTextLen;
    
    // wide char to multi char
    
    iTextLen = WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, NULL, 0, NULL, NULL );
    
    pElementText = new char[iTextLen + 1];
    
    memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
    
    ::WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, pElementText,iTextLen,NULL,NULL );
    
    string strText;
    
    strText = pElementText;
    
    delete[] pElementText;
    
    
    return strText;
    
    }
    
    wstring UTF8ToUnicode(( const string& str )
    {
    int   len = 0;
    
    len = str.length();
    
    int   unicodeLen = ::MultiByteToWideChar( CP_UTF8, 0, str.c_str(),-1,NULL,0 );  
    
    wchar_t *   pUnicode;  
    
    pUnicode = new   wchar_t[unicodeLen+1];  
    
    memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
    
    ::MultiByteToWideChar( CP_UTF8,0, str.c_str(),-1, (LPWSTR)pUnicode, unicodeLen );  
    
    wstring   rt;  
    rt = ( wchar_t* )pUnicode;
    delete   pUnicode; 
    return   rt;  
    
    }
    
    string UnicodeToUTF8( const wstring& str )
    {
    
    char*      pElementText;
    int     iTextLen;
    
    // wide char to multi char
    
    iTextLen = WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL );
    
    pElementText = new char[iTextLen + 1];
    
    memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
    
    ::WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, pElementText,iTextLen,NULL,NULL );
    
    string strText;
    
    strText = pElementText;
    
    delete[] pElementText;
    
    
    return strText;
    
    } 


  • 相关阅读:
    sqlserver,获取调用存储过程返回数据的方法。
    手动为弹窗添加一个阴影背景。
    bootstrap资料链接
    进入Linux救援(rescue)模式的四大法门
    virtual box 5.2.12 扩展包安装
    pypi配置国内开源镜像
    vs2015利用python加载dll调试配置
    ubuntu18安装ubuntu kylin软件中心
    firefox快捷键窗口和标签类
    设置双网卡路由
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318812.html
Copyright © 2011-2022 走看看