美文网首页
vs 工程设置中的“字符集”:mbcs与utf8编码

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

作者: 34864 | 来源:发表于2018-07-18 14:51 被阅读0次
    • 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编码

          本文链接:https://www.haomeiwen.com/subject/lmyopftx.html