①、Ansi与Unicode简要说明及各自的优缺点:
他们是两种字符的编码格式,Ansi=窄字节,Unicode=宽字节,Ansi用char格式表示一个字符,占用一个字节的存储空间,最多表示255个字符,表示英文还可以,但对于中文、日文、韩文等语言来说就不够用了,所以如果你的程序是Ansi编码的话,那么你写的中文语言的程序拿到日文、韩文等系统上面就会出现乱码。所以有了Unicode,用二个字节去表示一个字符,被定义成 wchar_t 格式这样就可以表示世界上绝大多数的语言了!但有利就有弊,缺点呢? 就是空间占用翻倍了,网络传输的数据量也增大了……
Ansi 窄字节,Unicode宽字节 Unicode可以表示世界上的大多数语言,国际化。但是占用两个字节,网络传输不方便。 |
②、不同编码格式下的字符串处理及相互转化:
/************************************************************************/
/* ANSI 窄字节
/************************************************************************/
/*
char a_char_1[10] = "MFC";
char *a_char_2 = "MFC";
PCHAR a_char_3 = "MFC";
PSTR a_char_4 = "MFC";
PCSTR a_char_5 = "MFC";
LPSTR a_char_6 = "MFC";
LPCSTR a_char_7 = "MFC";
*/
/************************************************************************/
/* UNICODE 宽字节
/************************************************************************/
/*
wchar_t w_char_1[10] = L"MFC";
wchar_t *w_char_2 = L"MFC";
WCHAR *w_char_3 = L"MFC";
PWCHAR w_char_4 = L"MFC";
PWSTR w_char_5 = L"MFC";
LPWSTR w_char_6 = L"MFC";
LPCWSTR w_char_7 = L"MFC";
*/
/************************************************************************/
/* T 通用类型
/************************************************************************/
/*
TCHAR t_char_1[10] = _T("MFC");
PTSTR t_char_2 = _T("MFC");
LPTSTR t_char_3 = _T("MFC");
LPCTSTR t_char_4 = _T("MFC");
*/
以上,其中:P代表指针的意思,STR代表字符串的意思,L是长指针的意思,C代表const常量的意思,W代表wide宽字节的意思,T可以理解为通用类型的意思. |
③、不同编码格式下的字符串处理及相互转化:
/************************************************************************/
/* 1:窄字节转换成宽字节(使用系统API函数)
/* 2:宽字节转成窄字节 (使用系统API函数)
/************************************************************************/
/*
char *mChar = "MFC";
TCHAR *mResult = AnsiToWideChar(mChar);
delete []mResult;
*/
/*
TCHAR *mChar = L"MFC";
char *mResult = WideCharToAnsi(mChar);
delete []mResult;
*/
char *WideCharToAnsi(wchar_t *pWideChar)
{
if(!pWideChar) return NULL;
char *ansiChar = NULL;
int needChar = WideCharToMultiByte(CP_ACP,0,pWideChar,-1, NULL, 0, NULL, NULL);
if (needChar > 0)
{
needChar += 1;
ansiChar = new char[needChar];
ZeroMemory(ansiChar,needChar);
WideCharToMultiByte(CP_ACP,0,pWideChar,-1, ansiChar, needChar, NULL, NULL);
}
return ansiChar;
}
wchar_t *AnsiToWideChar(char *pChar)
{
if(!pChar) return NULL;
wchar_t *wideChar = NULL;
int needChar = MultiByteToWideChar(CP_ACP, 0, pChar, -1, NULL, 0);
if (needChar > 0)
{
needChar += 1;
wideChar = new wchar_t[needChar];
ZeroMemory(wideChar, needChar*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, pChar, -1, wideChar, needChar);
}
return wideChar;
}
④、A2W、W2A、T2A、T2W 宏的使用以及注意事项
char *mChar = "MFC";
USES_CONVERSION;
TCHAR *mResult = A2W(mChar);
不要在一个函数的循环体中使用 A2W 等字符转换宏,可能引起栈溢出 |
⑤、字符串占用字节数:
● Ansi:
char szStr[] = "abc";
占用字节数求法:sizeof(szStr);
char *psz = "defgh";
占用字节数求法:strlen(psz)*sizeof(char);
● Unicode:
wchar_t szwStr[] = L"abc";
占用字节数求法:sizeof(szwStr);
wchar_t *pwsz = L"defgh";
占用字节数求法:wcslen(pwsz)*sizeof(wchar_t);
● 通用函数:
TCHAR szStr[] = _T("abc");
占用字节数求法:sizeof(szStr);
TCHAR *psz = _T("defgh");
占用字节数求法:_tcslen(psz)*sizeof(TCHAR);