utf8是unicode的一种实现方式.windows95及以前,还没有unicode,更没有utf8.所以在windows95及以前微软自己定义了一套解决多国语言的规则(mbcs),因为windows95的巨大成功,大量程序都是用的微软自己定义国语言规则.到windowsnt的时候unicode已经出现,所以的windowsnt的内核用了unicode编码(UCS-2),内核彻底解决了多国语言.但是为了和已有代码兼容,windows没有把自己的mbcs废除.mbcs用到什么时候现在还在用.到VS2017,mbcs还是微软解决的多国语音问题的默认方式.在VS2013的时候,微软建议过不要再使用mbcs(参考资料5),以后的版本可能不再提供.但用户不干了,因为太多的程序是用mbcs的方式,修改成unicode成本太大.所以到VS2015,mbcs又回来了,并且宣布以后的版本继续支持mbcs.微软那个纠结呀.
VS2013及以前微软的编译器cl只能支持utf8withbom(或者是用mbcs的方式,中文用cp936),一直到到vs2015或者vs2017,cl才有一个指定源代码字符编码的选项/source-charset,vs2015以前都没有.vs2015以前用vs写c语言程序用utf8编码(没有bom)会有很多问题.总之感谢微软,latebetterthannever!
假设vs2017的安装目录是%VS_HOME%,则用vs打开下面2个文件
%VS_HOME%\Common7\IDE\VC\vcprojectitems\hfile.h%VS_HOME%\Common7\IDE\VC\vcprojectitems\newc++file.cpp在这2个文件中加入一行中文注释,如
//utf8编码然后选择"高级保存选项",然后在编码中选择utf8(无签名)65001.这样再新建文件时,编码都是utf8.
看C00CmdHelloWorld.c的代码:
//编码设置为utf-8#include
clC00CmdHelloWorld.c/source-charset:utf-8C00CmdHelloWorld输出为
hellosizeis5您好sizeis4//编码设置为utf-8#include
//C03UnicodeMsg.c编码设置为utf-8#include
cluser32.libgdi32.lib/DUNICODE/source-charset:utf-8其中UNICODE就微软定义的宏.这个宏存在时TCHAR被定义为wchar_t,这个宏不存在时,TCHAR被定义为char.