c++项目:常用的字串相关操作,及异常排查

     项目中用到各种字符的操作,及转换,如CString到string,LPCSTR到CString,GBK到UFT8等转换, 凡此种种,经常忘记,经常遇到, 所以记录一下,弥补记忆力不足!

     提示1: 返回异常问题: 伪代码如下:

     LPCTSTR GetValue(LPCTSTR  lpszKey)

    {

              CString strTmp(lpszKey);

              //Doing  something

              return strTmp

    }

   具体用法:

   LPCSTR  pszKey = "中国加油!";

   CString strValue = GetValue(pszKey );    ///此处异常。

   排查问题最后确认,上述“strTmp” 为临时对象, 返回调用析构函数异常, 此类类推, 如下:

   class A  

    {

            CString     m_strData;

    }

    A* GetAInfor(LPCTSTR  lpszKey)

    {

           A   a ;

           a .m_strData = lpszKey;

           return &a;

    }

    A*  pA = GetAInfor(_T("中国加油!");

    CString strValue = pA->m_strData;  /// 异常

    解决方案: 如下:

  1, 返回对象,而非指针, 但是此时会调用默认的拷贝函数,浪费性能;

  2, 采用引用传值,获取数据的接口,性能优化时,避免类型的隐含的拷贝,复制函数等, 尤其在循环中, 如:

   BOOL  GetAInfor(A & rcA, LPCTSTR  lpszKey)

  {

          m_strData = lpszKey;

          return TRUE;

  }

此时的调用如下:

     A   a ;

    GetAInfor( &a, _T("中国加油!");

 令人烦躁的乱码问题,主要涉及字符相互转换,主要涉及如下接口:

WideCharToMultiByte 和 MultiByteToWideChar, 其中常用的代码页由CP_ACP和CP_UTF8两个
CP_ACP: 实现了ANSI与Unicode之间的转换
CP_UTF8:实现了UTF-8与Unicode之间的转换, 具体接口如下:

1.  ANSI to 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;  
}
2.  Unicode to ANSI
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;
}
3.  UTF-8 to Unicode
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;  
}
4.  Unicode to UTF-8    
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;
}

 

     

 

 

     

   

 

   

    

 

   

    

     

 

     

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值