- windows 的api中大多都有两个版本
例如,多字节字符集的MessageBoxA
,接收char
类型参数、和宽字符(unicode)的MessageBoxW
,接收wchar_t
类型参数。
"A"系列api的A是指此api接收mbcs的参数,"W"系列接收宽字符字符串。
它们每个都 一个没有后缀的版本如:MessageBox
,这个api其实取决于unicode的宏定义:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
与之对应的,也有参数类型的定义。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
-
编码
在不同版本的api中,字符串内容的编码也有区别。
char
类型(对应MessageBoxA
)的编码取决于本地代码页(locale-specific code page)。
wchar_t
类型(对应MessageBoxW
)的编码为unicode
,在windows平台上,unicode特指utf16,nothing else. -
MBCS与utf-8
mbcs是"multi-byte character set",多字节字符集。听起来这个字符集应该包含utf8。
但是在windows上,MBCS
仅代指"A"系列api支持的字符集,它包含的代码页有:932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987), 和950 (Big5)。
但是没有utf-8。
要使用utf8编码的字符串,要使用MultiByteToWideChar
将utf8转为utf16,调用"W"系列的api.然后再使用WideCharToMultiByte
将结果转为utf8。
其实在"A"系列的api内部也经历了这样的转变,最终调用的也是"W"系列的api。 -
在字符集选项中还有一个“未设置”,这个选项下,在代码里调用api的时候,就要看相关的宏定义了,如上面的
UNICODE
或者_MBCS
。
ref:
https://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
https://stackoverflow.com/questions/17742379/visual-studio-character-sets-not-set-vs-multi-byte-character-set
网友评论