ANSI 和 Unicode

来源:互联网 发布:java getinstance 编辑:程序博客网 时间:2024/05/01 20:33
为什么使用Unicode?
可以很容易地在不同语言之间进行数据交换。

可以实现同一个二进制.exe文件或DLL文件支持多种语言。

可以提高应用程序的运行效率。Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。

Windows CE 是使用Unicode的一种操作系统,完全不支持ANSI Windows函数。

Windows 98 只支持ANSI,只能为ANSI开发应用程序。
区分ANSI和Unicode函数
首先,函数的参数及其返回值的数据类型不同。如:
char *strcpy( char *strDestination, const char *strSource );
wchar_t *wcscpy(的 wchar_t *strDestination, const wchar_t *strSource );
unsigned char *_mbscpy( unsigned char *strDestination, const unsigned char *strSource );

wcscpy and _mbscpy are wide-character and multibyte-character versions of strcpy. The arguments and return value of wcscpy are wide-character strings; those of _mbscpy are multibyte-character strings. These three functions behave identically otherwise.

Windows定义的Unicode数据类型:
WCHAR Unicode字符,PWSTR 指向Unicode字符串的指针,PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。

其次,函数命名规则不同,如:
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy

所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE