时不常就要用一下,老是记不住,放空间里,做个备忘录了。
1。char数组转化为CString。
(1)方法一:
char cBuf[] = {0x31,0x32,0x33}; // _T("123")
CString str = _T("");
#ifdef _UNICODE
// Ansi码转化为unicode码
WCHAR wTmp[BUF_SIZE] = {};
// 转换为unicode码
if (0 == MultiByteToWideChar(CP_ACP,0,(LPCSTR)cBuf,-1,wTmp,BUF_SIZE)) {
assert(false);
} else {
CString strTmp(wTmp);
}
#else
CString strTmp(cBuf);
#endif // _UNICODE
(2)方法二:
char cBuf[] = {0x31,0x32,0x33}; // _T("123")
CString str = _T("");
#ifdef _UNICODE
USES_CONVERSION;
LPTSTR pStr = A2W((char*)cBuf);
str.Format(_T("%s"),pStr);
#else
str.Format(_T("%s"),cBuf);
#endif // _UNICODE
2。wchar数组转化为CString。
(1)方法一:
wchar cBuf[] = {0x31,0x00,0x32,0x00,0x33,0x00}; // _T("123")
CString str = _T("");
#ifdef _UNICODE
CString strTmp(cBuf);
#else
// unicode码转化为Ansi码
char aTmp[BUF_SIZE] = {};
// 转换为ANSI码
if (0 == WideCharToMultiByte(CP_ACP,0,cBuf,-1,aTmp,BUF_SIZE,NULL,NULL)) {
assert(false);
} else {
CString strTmp(aTmp);
}
#endif // _UNICODE
(2)方法二:
wchar cBuf[] = {0x31,0x00,0x32,0x00,0x33,0x00}; // _T("123")
CString str = _T("");
#ifdef _UNICODE
CString strTmp(cBuf);
#else
// unicode码转化为Ansi码
USES_CONVERSION;
char* pStr = W2A(strAlarmId);
str.Format(_T("%s"),pStr);
#endif // _UNICODE
//-----------------------------------------------------总结-------------------------------------------------------------
ansi以2个字节表示一个字符,unicode以一个字节表示一个字符。比如'0',unicode编码表示为0x0030,而ansi表示为0x30,就这个差别。但是表现在文件中时,一般区分文件是unicode还是ansi,就是要看文件的开始两个字节是不是0xFEFF,是则为unicode否即为ansi。
1. 不要出现在程序中出现这样的定义 wchar_t fullstop = L"hello";这是奇怪的定义,这个本意是想让字符fullstop等于字符"hello",但是要知道"hello"只有在unicode编码文件中才能识别为hello这个单词。而vc6,它也是文本处理器,它默认的编码标准是ansi encoding,所以写上这样的一句表达示,会有些奇怪的问题出现,结果肯定是不对的。但是到了EVC 4.0 或者VS2005 中必须要这样写因为这两个开发环境是unicode 编码的。所以处理字符串的时候如CString 类型一定要进行多字节的转换,也就是告诉编译器把unicode(2字节) 转换到ansi(1字节),经典转换方法有两种如下:
1. CString to ansi char
CString m_address;
char ansiRemoteHost[255];
ZeroMemory(ansiRemoteHost,255);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_address,wcslen(m_address),
ansiRemoteHost,wcslen(m_address),NULL,NULL);
ansi char to CString
CString MyExam::CharToUnicode(BYTE* buf, DWORD bufSize)
{
CString csTemp;
WCHAR *UnicodeStr=new WCHAR[bufSize+1];
DWORD UnicodeSize=MultiByteToWideChar(CP_ACP,0,
(LPCSTR)buf,bufSize+1,UnicodeStr,(DWORD)bufSize+1);
csTemp=UnicodeStr;
delete [] UnicodeStr;
return (csTemp);
}
2. 利用wcstombs and mbstowcs
CString to ansi char
CString m_sendData;
char* sendBuf=new char[m_sendData.GetLength()*2];
wcstombs(sendBuf,m_sendData,m_sendData.GetLength());
ansi char to CString
CString GetLocalIP()
{
HOSTENT* LocalAddress;
char * Buff=new char[256];
TCHAR *wBuff=new TCHAR[256];
memset(Buff,'/0',256);
memset(wBuff,L'/0',256*sizeof(TCHAR));
if(gethostname(Buff,256)==0)
{
mbstowcs(wBuff,Buff,256);
LocalAddress=gethostbyname(Buff);
memset(Buff,L'/0',256);
sprintf(Buff,"%d.%d.%d.%d/0",LocalAddress->h_addr_list[0][0]&0xff,LocalAddress->h_addr_list[0][1]&0x00ff,LocalAddress->h_addr_list[0][2]&0x0000ff,LocalAddress->h_addr_list[0][3]&0x000000ff);
memset(wBuff,L'/0',256*sizeof(TCHAR));
mbstowcs(wBuff,Buff,256);
strReturn=wBuff;
}
delete [] Buff;
delete [] wBuff;
return strReturn;
}
只要掌握这两种转化方法在unicode 的环境中进行编程就不回出现问题了。