Windows既可以使用Unicode字符集又可以使用传统的字符集(例如多字节编码)来实现对多种语言的支持。与传统的字符集编码相比,Unicode是世界通用的字符编码标准,使用16位数据表示一个字符(UTF-16)。传统的字符集,例如Windows ANSI字符集,使用8位一个字符。或者将相邻的两个8位的数据组合在一起表示特殊的语言字符。
Windows系统采用了ANSI字符的扩展方式,如果一个字节是负数,则将其后续的一个字节组合在一起表示一个字符。这种编码方式的字符集也称为“多字节”字符集。
Windows系统中,Unicode字符集编码和多字节字符编码都可以使用。
UTF-16称为wide characters,用以区分8位的ANSI。
c++中的wchar_t 来表示 wide characters。在定义一个wide characters变量时,前面需要加上‘L’。
例如:wchar_t *str=L"hello word";
下面是win32中同字符串相关类型。
Typedef | Definition |
---|---|
CHAR | char |
PSTR or LPSTR | char* |
PCSTR or LPCSTR | const char* |
PWSTR or LPWSTR | wchar_t* |
PCWSTR or LPCWSTR | const wchar_t* |
Unicode同ANSI两字符集在混用的时候,需要进行转换。有时我们用到了一些涉及字符串参数的方法,无需考虑字符集的问题,那是因为已有程序为我们做好了转换。
例如:
SetWindowTextA()方法,其内参数为ANSI字符集编码方式。
SetWindowTextW()方法,其内参数为Unicode字符集编码方式。
而我们在设置text内容时,只需调用SetWindowText()方法。
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
上述的代码为我们做好了转换。
事实上,如今的应用大多都用的是Unicode字符编码方式。很多的语言都需要Unicode去编码。使用ANSI可能无法使应用本地化。很多新的API只有Unicode版本的,而没有ANSI版本的。
当应用需要同时支持多种旧的操作系统版本时,可方便地将字符串转换为Unicode或ANSI很重要。windows的micro提供了将字符串转换为Unicode或ANSI的方法。
Macro | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t | char |
TEXT("x") | L"x" | "x" |
很多程序开头都定义了一些处理字符集问题的micro。
例如:
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
需要注意的是,有些预处理的标识为UNICODE,而有的标识为_UNICODE。两个标识都定义了最好。