ANSI字符集是采用单字节表示的,也称为窄字符,是计算机发展初期阶段的编码产物,体现在WIN* 9X及其以前的操作系统中.
Unicode字符集是采用双字符节表示的,也称为宽字符,它不但兼容ANSI,而且还包含阿拉伯文,中文拼音,日俄韩等多国文字和大量标点符号. NT系列的2000,2003,XP等操作系统内核都采用Unicode字符集.
使用Unicode编程是发展的必然趋势,ANSI也位列淘汰之首,但现在使用win9x系列的用户仍然不在少数,所以考虑到程序的移植性,应该培养编写代码时,同时兼容ANSI和Unicode的习惯.
1.使用宏 _T
如果在程序中以下方式定义了一个字符串:
"In China" // 那么编译器将把它看做个ANSI字符串
而如下方式:
L"In China" // 则编译器将使用Unicode字符集.
为此MFC定义了一个宏 _T,形式如下:
#ifdef _UNICODE
#define _T(x) L##(x)
#else
#define _T(x) (x)
#endif
_T("In China") //使用宏_T
如果定义了符号_UNICODE,则使用Unicode字符集,否则就使用ANSI字符集.
2.使用类型 TCHAR
ANSI C提供了对Unicode支持,并定义了一个wchar_t类型,其原型如下:
typedef unsigned short wchar_t
对应的字符操作函数也由str开头变为wcs开头,如:
strcpy <-----> wcscpy
strchr <-----> wcschr
.....
为了方便代码的编写,MFC提供了TCHAR类型,定义如下:
#ifdef _UNICODE
typedef wchar_t TCHAR
#else
typedef char TCHAR
#endif
其意义同上.
相对应的函数以_tcsXXX开头:
_tcslen, _tcsstr,_tcscpy ...
以上这些MFC定义的宏,都是为提高程序的可移植性而服务的,如果要编写兼容ANSI和Unicode的代码,应遵循以下几点
A.字符类型定义都以TCHAR或PTSTR型指定
B.原字符都使用宏_T()
C.字符操作函数尽量使用_tcs开头的宏
windows API也提供几个字符串操作函数
lstrlen, lstrcpy, lstrcmp, lstrcmpi ,lstrcat
这些函数也是以宏的形式实现的,分别对应着Unicode版本(lstrXXXW)和ANSI版本(lstrXXXA)
其中lstrcmp,lstrcmpi 的内部运行方式和_tcscmp不一样,详细信息可参看windows内核编程或 MSDN.
D.尽量使用windows提供的宏定义的类型或函数
windows不仅提供了以上宏实现的函数,也同样提供了islower, isupper类似功能的IsCharLower...
等通用版本
3. ANSI 与UNICODE之间的转换
ANSI to UNICODE:
int MultiByteToWideChar(
UINT CodePage, // 代码页号 通常使用CP_CAP
DWORD dwFlags, //设置一些标志符 ,通常0
LPCSTR lpMultiByteStr, //源字符串地址
int cchMultiByte, //源字符串长度
LPWSTR lpWideCharStr, //目标字符串地址
int cchWideChar //目标串长度
);
UNICODE To ANSI :
int WideCharToMultiByte(
UINT CodePage, // 同上
DWORD dwFlags, //同上
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cchMultiByte,
LPCSTR lpDefaultChar, //不能转换某个字符时采用的替换字符,默认是'?'
LPBOOL lpUsedDefaultChar //如果全部转换成功则为FALSE 否则为TRUE
);
以上两个函数都可以先以目标串地址为空,长度为0,调用得到所需转换空间后,再动态申请空间,然后再次调用.