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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 字符是用户可以读写的最小单位。计算机所能支持的字符组成的集合,就叫做字符集。字符集通常以二维表的形式存在。二维表的...
    刘惜有阅读 12,560评论 2 14
  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 12,906评论 0 13
  • 0 前言 在平时的开发过程中大部分人应该都遇到过中文乱码问题,浏览网页时也会遇到内容显示乱码的情况,一般遇到这种情...
    小猪啊呜阅读 7,772评论 1 10
  • UTF-8 编码提供了一种简便而向后兼容的方法, 使得那种完全围绕 ASCII 设计的操作系统, 比如 Unix,...
    谢大见阅读 10,309评论 0 3
  • 现在距知晓岗位分布情况和档案分数已过去进十天,距选岗还有不到一周时间。在过去的几天里,我的心情跟过山车差不多。自己...
    踏上笔尖阅读 1,504评论 0 0

友情链接更多精彩内容