Visual Studio 2015的坑:中文字符串编译后成乱码
(2015年8月5日更新:微软已经修复了Roslyn的这个bug,详见 https://github.com/dotnet/roslyn/pull/4303 )
昨天,我们用VS2015编译了博客程序中的一个程序集并发布上线。
今天有园友反馈向我们反馈,个人博客分页显示随笔列表的页面中,“上一页”“下一页”显示乱码:

而这个地方的“上一页”“下一页”字符串恰恰是在我们昨天发布的程序集中定义的:
public class Pager : Control
{
protected string PreviousText = "上一页";
protected string NextText = "下一页"; //...
}
可是昨天我们并没有更改这部分代码,肯定不是我们昨天代码修改引起的。
于是,我们改用VS2013重新编译了一下这个程序集,更新之后,乱码立马消失。
接着,用ILSpy反编译了VS2015所编译出的程序集的IL代码之后,真相大白:
public class Pager : Control
{
protected string PreviousText = "ÉÏÒ»Ò³";
protected string NextText = "ÏÂÒ»Ò³";
//...
}
原来是VS2015所用的编译器惹的祸,而这个编译器就是大名鼎鼎的 Roslyn 。
大家使用 Visual Studio 2015 时需要注意一下这个问题。
【补充】
用ildasm查看VS2015编译出来的程序集的IL代码(乱码):
.maxstack 2
IL_0000: ldarg.0
IL_0001: ldstr bytearray (C9 00 CF 00 D2 00 BB 00 D2 00 B3 00 )
IL_0006: stfld string BlogServer.Web.Controls.Pager::PreviousText
IL_000b: ldarg.0
IL_000c: ldstr bytearray (CF 00 C2 00 D2 00 BB 00 D2 00 B3 00 )
IL_0011: stfld string BlogServer.Web.Controls.Pager::NextText
用ildasm查看VS2013编译出来的程序集的IL代码(未乱码):
.maxstack 2
IL_0000: ldarg.0
IL_0001: ldstr bytearray (0A 4E 00 4E 75 98 ) // .N.Nu.
IL_0006: stfld string BlogServer.Web.Controls.Pager::PreviousText
IL_000b: ldarg.0
IL_000c: ldstr bytearray (0B 4E 00 4E 75 98 ) // .N.Nu.
IL_0011: stfld string BlogServer.Web.Controls.Pager::NextText
【问题原因与临时解决方法】
在GitHub上提交Issue之后,从回复中得知这个问题与Roslyn检测文件编码的处理方式有关。
查看出现乱码问题的.cs文件编码,发现用的是ANSI编码。于是以UTF-8编码另存该文件,然后用VS2015重新编译,问题解决。
VS2015 RC中没这个问题。
【GitHub上的相关链接】
* VS2015打开非unicode编码的代码,其中变量名有中文就无法编译的bug
* VS2015 (MSBuild/14) compiler can't detect file ecoding correctly
* Chinese string is compiled to garbage characters
* Roslyn can't detect 932 encoding
Visual Studio 2015的坑:中文字符串编译后成乱码的更多相关文章
- 又发现一个visual studio 2015的坑啊。
又发现一个visual studio 2015的坑啊...我的后台管理的目录名称叫@duck, 但是在新版VS2015中打开项目后编译,出现错误: Error opening response fil ...
- Visual studio 2015程序转Eclipse gun编译出现的问题总结
Visual studio 2015程序转Eclipse gun编译出现的问题总结 1.C++11支持 1)Project settings project右键-> c/c++ build -& ...
- [No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)
1.7-ZIP简介 7-zip 是一款免费的压缩解压软件.ZIP格式的文件默认被苹果和微软支持,完全不需要额外安装其他软件就可以解压.但对于非US-ASCII编码的文件名和大于2GB的ZIP文件,可能 ...
- Visual Studio 2015 如何将全英界面转成中文
1 启动VS2015程序,在菜单栏中找到tools 2 在弹出的下拉窗口中选中options 3 此时弹出的对话框,选中Environment下的international setting 4 点击获 ...
- [No0000AD]7z源码完全移植至Visual Studio 2015
今天在上次的基础上(原文地址:[No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)),将7Z的源码完全移植到了vs2015开发环境下 ...
- Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用 Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.cs ...
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.css预处理器的构建工具,它帮助开发者处理客户端开发中的一些烦操重复性的工作.Grun ...
- Visual Studio 2015 Tools for Unity使用基础
Unity4.x编辑器侧 具体版本号:Visual Studio 2015 Tools for Unity 3.7.0.1 该插件在:Microsoft Visual Studio Tools for ...
- Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑
PS.在之前的一篇文章中介绍了如何用Visual Studio 2015编译zmq,在编译同解决方案中除了libzmq之外的项目例如inproc_thr时会报错误,具如下: Severity Code ...
随机推荐
- 初识HTML
前面的话 HTML文档的后缀一般都是.html,但是在以前,.htm后缀也是不少的,它们都代表html文档,实际上也没有本质的区别.htm是在win32时代,系统只能识别3位扩展名时使用的.现在一般都 ...
- TypeScript的4种编译方式
1.手动编译 1.1.首先找到TypeScript的安装目录,我的在"C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0".
- JS代码和OC代码的相互调用
JS调用OC 很多应用里面或多或少的调用了网页,来达到绚丽的效果,所谓的JS调用OC.....举个例子吧,网页上有个按钮 点击按钮跳转界面,跳转的动作由OC的代码实现. OC调用JS 还是举个例子,我 ...
- JSPatch使用小记
hotfix的作用众所周知,Android和iOS都有各自的技术,但是相比Android的当天发布来说(如果你们的项目不需要灰度),iOS热更新的意义更加重大.因为iOS审核周期长不说,而且运气不好会 ...
- iOS开发-UI 从入门到精通(二)
iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...
- synthesize 与dynamic的区别
官方文档解释: @synthesize will generate getter and setter methods for your property. @dynamic just tells t ...
- iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具
这是个很有用的列别工具类,在聊天对话框添加和QQ一样的"复制.粘贴.取消"等选项,而且使用起来很方便,只要找到聊天泡泡内部的某个View,比如Label或者背景冒泡的UIImage ...
- python之import子目录文件
问题: 在pre_tab.py文件下: print("AA") from test.te import login1 login1() from test.te import ...
- 通过VLD扩展分析PHP opcode
安装VLD扩展 ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld 生成脚本opcode > p ...
- CouchDB简介
类型:开源数据库,Apache项目 存储格式:JSON 查询语言:JavaScript API :MapReduce.HTTP 特点 MVCC(Multiversion concurrency con ...