前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vs2015:/utf-8选项解决UTF-8 without BOM 源码中文输出乱码问题

vs2015:/utf-8选项解决UTF-8 without BOM 源码中文输出乱码问题

作者头像
10km
发布2019-05-25 21:03:45
6K0
发布2019-05-25 21:03:45
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433493

本来我已经参考网上关于C++中文输出乱码的文章解决了,如下面的代码输出前调用wcout.imbue设置locale,就可以正常输出中文了。

代码语言:javascript
复制
std::wcout.imbue(std::locale(std::locale(), "", LC_CTYPE));
std::wcout << L"江清月近人" << std::endl;

但是同样的方法换在另一个程序中还是输出乱码。反复查找原因,最后发现是两个源码的编码格式不同。虽然都是UTF-8,但是能正确输出中文的源码文件是带BOM头的,另一个是不带BOM的。参考这个篇文章《MSVC中C++ UTF8中文编码处理探究》搞明白了MSVC对于不带BOM的UTF-8文件,默认会根据本地locale的设置来决定文件的编码(对于简体中文系统,就是GBK)。所以会对于UTF-8 without BOM的代码文件输出中文就是乱码。对于UTF-8 with BOM文件,会正确将其按照UTF-8来识别。

/utf-8 编译选项

MSVC对于UTF-8 without BOM格式支持不好,这个问题由来已久,在VS2015之前的版本一直存在。

在VS2015版本(Visual Studio 2015 Update 2),增加一个编译选项/utf-8,该编译选项的作用就是将源码字符集和执行文件字符集指定为UTF-8。增加该编译选项后,再重新编译运行,程序正确输出中文,问题解决。

参见微软官网:《/utf-8 (Set Source and Executable character sets to UTF-8)》

#pragma execution_character_set(“utf-8”)

其实网上可以找到不少文章提到还有另一个解决办法, 就是在源码中插入预处理指令#pragma execution_character_set("utf-8")

代码语言:javascript
复制
#if defined(_MSC_VER) && (_MSC_VER >= 1900)    
# pragma execution_character_set("utf-8")    
#endif

这是关于该指令的官网说明:《execution_character_set》

根据这个说明,这个指令似乎是VS2015才有的(我的电脑没有别的版本的MSVC所以没办法验证VS2015之前的版本是否支持这个指令),但是在Visual Studio 2015 Update 2版本就废弃了。我的VS2015版本是Visual Studio 2015 Update 3,对这个指令确实无效。

Visual Studio 保存UTF-8 without BOM

为什么要用UTF-8 without BOM来保存源码?

主要的原因是linux下编译器不支持UTF-8 with BOM的源码编译,其实如果你的项目没有跨平台编译的要求,并不一定要将源码保存为UTF-8 without BOM格式。

如果你希望在Visual Studio中将源码保存为UTF-8 without BOM格式,如下设置一下高级保存选项就可以了。

默认是Unicode(UTF-8 带签名)-代码页65001,这里要修改为Unicode(UTF-8 无签名)-代码页65001

参考文章

《MSVC中C++ UTF8中文编码处理探究》

《/utf-8 (Set Source and Executable character sets to UTF-8)》

《execution_character_set》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • /utf-8 编译选项
  • #pragma execution_character_set(“utf-8”)
  • Visual Studio 保存UTF-8 without BOM
  • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档