1 Windows中的字符类型
Generic-text data type | SBCS | MBCS | UNICODE |
TCHAR | char | char | wchar_t |
1.1 SBCS
单子节字符集(Single-Byte Character Set),所有的字符都只用一个字节表示。ASCII就是SBCS的一种。SBCS字符串的结束标志是一个单字节表示的0。
C语言中的字符串函数,strcpy()、sprintf( )等只用来处理单字节字符串。
1.2 MBCS
多字节字符集(Multi-Byte Character Set),一些字符用一个字节表示,而另一些字符用多于一个字节表示。在Windows里的MBCS包含两种字符类型,单字节字符(Single-Byte Characters)和双字节字符(Double-Byte Characters)。MBCS字符串的结束标志是一个单字节表示的0。
Micrsoft在CRT(C Runtime Library)中提供处理MBCS字符串的函数:str***( )函数都有对应的MBCS版本_mbs***( )。
1.3 Unicode
Unicode,所有的字符都用两个字节表示。Unicode字符也被称作宽字符。Unicode字符串的结束标志是两个字节表示的0。
Unicode字符类型用wchar_t来表示。Unicode字符和Unicode字符串用前缀L来表示。
C中的字符串函数,wcscpy()、swprintf( )等只用来处理Unicode字符串。
UTF-8是Unicode的一种实现方式,需要注意的是UTF-8中0x00~0x7F之间字符的编码方式和SBCS是一样的,也就是说这些字符只用一个字节表示。
1.3.1 字符串处理函数
Win32中的每个与字符串相关的API都有两个版本。一个版本接受MBCS字符串,另一个接受Unicode字符串。后缀A表明是MBCS版本,后缀W表明是Unicode版本。
例如,在windows中根本没有SetWindowText()这个API,只有SetWindowTextA()和SetWindowTextW( ),而且在<winuser.h>中包含了一些宏:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
所以我们可以使用SetWindowText( )这个API,编译器会根据我们选取的编码方式自动来识别相应的版本。
为了可以在MBCS和Unicode环境下使用同样的代码,Win32中提供了TCHAR类型:
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
另外还需要使用宏_T(x),定义如下:
#ifdef UNICODE
#define _T(x) L##x
#else
#define _T(x) x
#endif
而且Win32中提供了字符串函数TCHAR类型的宏,例如:_tcs***( )宏代替str***( )、_mbs***( )和wcs***( )。 MSDN中Generic-Text Routine Mappings有完整的宏列表。
2 Windows中的数据类型
Windows Data Types | Description |
BOOL (32bit) | int // TRUE or FALSE |
BOOLEAN (8bit) | BYTE // TRUE or FALSE |
BYTE (8bit) | unsigned char |
WCHAR (16bit) | wchar_t // 16-bit Unicode character |
WORD (16bit) | unsigned short |
DWORD (32bit) | unsigned long |
DWORD32 (32bit) | unsigned int |
DWORD64 (64bit) | unsigned __int64 |
DWORDLONG (64bit) | ULONGLONG |
SHORT (16bit) | short |
INT (32bit) | int |
INT32 (32bit) | signed int |
INT64 (64bit) | signed __int64 |
LONG (32bit) | long |
LONG32 (32bit) | signed int |
LONG64 (64bit) | __int64 |
LONGLONG (64bit) | __int64 |
TBYTE | #ifdef UNICODE WCHAR #else unsigned char |
TCHAR | #ifdef UNICODE WCHAR #else char |
PSTR / LPSTR | typedef CHAR * PSTR/LPSTR; |
PWSTR / LPWSTR | typedef WCHAR * PWSTR/LPWSTR; |
PTSTR / LPTSTR | #ifdef UNICODE PWSTR/LPWSTR #else PSTR/LPSTR |
VOID | void |
PVOID / LPVOID | typedef void* PVOID / LPVOID; |
HANDLE | PVOID |
HRESULT | LONG |
HWND | HANDLE |
WORD MAKEWORD( BYTE bLow, BYTE bHigh );
BYTE LOBYTE( WORD wValue );
BYTE HIBYTE( WORD wValue );
WORD LOWORD( DWORD dwValue );
WORD HIWORD( DWORD dwValue );