vs 工程设置中的“字符集”:mbcs与utf8编码

  • 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

你可能感兴趣的:(vs 工程设置中的“字符集”:mbcs与utf8编码)