项目中用到各种字符的操作,及转换,如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;
}