- 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