Unicode和多字节

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中同字符串相关类型。

TypedefDefinition
CHARchar
PSTR or LPSTRchar*
PCSTR or LPCSTRconst char*
PWSTR or LPWSTRwchar_t*
PCWSTR or LPCWSTRconst 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的方法。

MacroUnicodeANSI
TCHARwchar_tchar
TEXT("x")L"x""x"

很多程序开头都定义了一些处理字符集问题的micro。

例如:

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

需要注意的是,有些预处理的标识为UNICODE,而有的标识为_UNICODE。两个标识都定义了最好。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页