• 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;
    
    } 


  • 相关阅读:
    Django model转字典的几种方法
    使用Nagios打造专业的业务状态监控
    Etcd安全配置之Basic Auth认证
    ELK日志系统之通用应用程序日志接入方案
    ELK日志系统之使用Rsyslog快速方便的收集Nginx日志
    中小团队落地配置中心详解
    ELK构建MySQL慢日志收集平台详解
    Django model select的各种用法详解
    Python:每日一题003
    Python:每日一题002
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318812.html
Copyright © 2020-2023  润新知