• 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本文标题:修改Visual Studio Express 2012新建C++文件编码
  • 本文链接:http://zengrong.net/post/1900.htm

2013-12-03 更新:增加关于UTF-8(BOM)的说明


我突然发现Visual Studio Express 2012(后简称为VS)建立的源文件是cp936(GB2312)编码,这个以后在Linux和Mac下面编译起来可能会有麻烦。

初步解决

于是,我尝试将已有项目中的文件改成了UTF-8格式,并设置保存格式为UTF-8,大概有这样几步:

  1. “工具-选项-环境-文档-不能以代码页的编码格式保存数据时将文档保存为Unicode”
  2. “工具-选项-文本编辑器-常规-自动检测不带签名的UTF-8编码”
  3. 在文件打开的情况下,选择“文件-高级保存选项”,设置编码和行尾
  4. 在另存文件的时候选择“编码保存”

请原谅我使用中文描述界面,因为当时安装VS的时候手贱选了简中界面,然后无论如何都没法安装英文语言包……

上面的1、2两项好像没什么用,关键是第3项。

根据我的习惯,将编码设置为“Unicode(UTF-8无签名) – 代码页 65001”,将行尾设置为“Unix(LF)”。

然后测试保存,再用Vim打开文件查看编码,发现文件确实保存为UTF-8编码了。

但是(什么事情都有但是),当我重新打开这个文件的时候,重新查看“高级保存选项”,发现编码又变成了“简体中文(GB2312)-代码页936”。

届时维尼奥神马!!!

第二步解决

我猜测,是由于VS无法识别不带签名的UTF-8编码文件造成的。

要将一个文本文件被作为UTF-8编码对待,可能需要以下几个条件(或者之一):

  1. 文件中包含UTF-8签名;
  2. 文件中包含UTF-8编码的字符(不能全是ASCII可以解释的字符);
  3. 编辑器优先以UTF-8编码来解析。

例如我对Vim的设置,就是将UTF-8侦测放在优先的位置

那么,让我来验证一下猜测是否正确。

在“高级保存选项”中将编码设置为“Unicode(UTF-8带签名) – 代码页 65001”,然后保存。重新打开,编码没有变化。

这说明我的猜测是正确的。

那么,再来验证一下上面条件的第2项是否正确。

在“高级保存选项”中将编码设置为“Unicode(UTF-8无签名) – 代码页 65001”,加入一些中文内容,然后保存。重新打开,编码没有变化。

那么,现在我可以断定,VS可以正常识别UTF-8编码,但我需要满足上面的条件1或者2。

需要注意的是,即使是已有的项目中,所有文件都已经是UTF-8编码(例如cocos2d-x的项目模版),但使用VS打开并进行保存后,原来的文件编码都会变成CP936。这是因为原来的模版文件中的文件是UTF-8(无签名)的。至于解决方法,参考上面了。

新建C++文件的编码

修改下面这几个模版文件的编码和行尾值,在VS中新建的cpp或者h文件,默认就是UTF-8编码了(路径自己改):

  • c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCProjectItems_WDExpress\newc++file.cpp
  • c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCProjectItems_WDExpress\hfile.h
  • c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCNewItems_WDExpress\newc++file.cpp
  • c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCNewItems_WDExpress\hfile.h

这些文件默认都是0字节的空文件,因此建议在其中加入一些注释,并将文件编码设置为UTF-8(带签名),行尾设置为Unix格式即可。

如果希望修改更多的东西,比如wizard之类的,可以看看这篇文章:VS2008中自定义C++工程模板与修改新建文件默认编码的办法

最后的问题

这种修改默认文件模版为 UTF-8(带签名) 的方法,其实是不被推荐的,原因是这本来是微软一厢情愿的做法。而我们的项目本来就应该跨平台,这种文件在Mac平台下编译,可能会有问题。

详见这篇:「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个?

但是,由于我 使用Eclipse+CDT开发Cocos2d-x(不用Visual Studio) 的尝试失败了,所以好像只能被迫接受这种现象了。

修改VISUAL STUDIO EXPRESS 2012新建C++文件编码的更多相关文章

  1. 离线安装 Visual Studio Express 而不下载整个镜像文件的方法(转载)

    转 visual studio 2010 express 全序列号 phone开发工具YDK44-2WW9W-QV7PM-8P8G8-FTYDF VC# 2010 Express: PQT8W-68Y ...

  2. Visual Studio命令行创建库文件lib

    Visual Studio命令行创建库文件lib OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 建一个文件Static_Lib.h,源代码如下 #ifndef ...

  3. Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥

    Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥: YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 已经过本人测试 本着分享的精神,希望大家 ...

  4. Microsoft Visual Studio Professional 2012 专业版 下载

    记录(以下内容来自网络收集): 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=30682 直接iso连接下载址: htt ...

  5. 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置

    Visual Studio 2017的"最近的文件列表"和"项目列表"总是删了之后重启电脑又出现(PS:这期间没有打开过项目,更没打开过VS). 一怒之下,按照 ...

  6. vs里 .sln和.suo 文件 Visual Studio里*.sln和*.suo文件的作用

    Visual Studio里*.sln和*.suo文件的作用      VS项目采用两种文件类型(.sln   和   .suo)来存储特定于解决方案的设置.这些文件总称为解决方案文件,为解决方案资源 ...

  7. 解决Visual Studio 2010/2012在调试时lock文件的方法

    调试3dsmax插件,有一个避免每次修改插件代码都需要重启3dsmax的方法,就是将导出的核心代码写在一个独立的DLL中,然后在插件代码需要导出时LoadLibrary这个DLL,导出之后再FreeL ...

  8. [转发]在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤

    官方学习文档:http://developer.xamarin.com/guides/android/getting_started/ 官方学习例子:http://developer.xamarin. ...

  9. 在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32

    csunking贡献,2015-9-22 1712 1.   概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能 ...

随机推荐

  1. C#中字符串的处理,对象的引用及继承(Tenth day)

    又进入到了新的一周,现在到总结的时间了,继续为大家总结一下今天在云和学院所学的知识. 理论: StringBuilder 和 String 的区别    String 在进行运算时(如赋值.拼接等)会 ...

  2. JavaSE学习总结第17天_集合框架3

      17.01 ArrayList集合的toString()方法源码解析 代码: Collection c = new ArrayList(); c.add("hello"); c ...

  3. TCP粘包和半包的处理方法

    先把处理的方法的代码放这里: 解析数据帧的代码: bool CSocket::findData(byte* buff, int& len) { for (int i = 0; i <= ...

  4. 玩2k16

    2k是我最喜欢的游戏啦,平时无聊了都会搞两盘.现在到2k16了,玩游戏时碰到一些麻烦,记录便查. 我哥一直说他的电脑玩2K16非常卡,根本玩不了,但是他的电脑配置可比我的高啊,我玩起溜溜地,喊他把配置 ...

  5. kinect for windows - DepthBasics-D2D详解之一

    Depth在kinect中经常被翻译为深度图,指的是图像到摄像头的距离,这些距离数据能让机器知道物理距离有多远.kinect通过两个红外摄像头来实现这个功能的.在这个例子里,就实现了深度图的提取和现实 ...

  6. Uva 225 Golygons

    这道题如果直接用Dfs,运气好的话是可以直接过的. 但如果要在Dfs的基础上加快速度,剪枝是必不可少的. 我的剪枝策略: 1.当前点(x,y)回到出发点至少需要 |x| +| y| 步,如果剩余的步数 ...

  7. wiki oi 1044 拦截导弹

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  8. ZIOZIA_百度百科

    ZIOZIA_百度百科 ZIOZIA

  9. 关于 firefox 无法在 passport.csdn.net 找到该服务器

    很奇怪的现象:用firefox上网,某些网站打开总是会提示 无法在XXX找到该服务器.但是使用其他浏览器,比如360却可以正常打开. 我已经将firefox加入了防火墙的信任列表,但是仍旧是这样. 而 ...

  10. Linux下批量转换文件编码

    find -iname "*.java" -exec enca {} + |grep -v ASCI |grep -v -i utf |awk -F':' '{print $1}' ...