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 ...
随机推荐
- Unix Linux 通用vi命令,使用帮助手册【珍藏版】
Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都差不多 ...
- [转]完美洗牌(Perfect Shuffle)问题
[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md ...
- 虚拟机VMware与主机共享文件介绍
我们经常会在Windows平台安装虚拟机VMware,不管是出于实验测试还是工作需要,伴随而来的就是经常需要在Windows系统和虚拟机系统之间进行共享数据文件,例如,需要将Window主机上的Ora ...
- linq to sql 输出SQL语句
DataClassesDataContext db = new DataClassesDataContext(); db.Log=Response.Output; var result = from ...
- stm32 hid 键盘描述
/* USB Standard Device Descriptor */ const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DES ...
- #ifndef _LED_H #endif啥意思?
#ifndef _LED_H#ifndef _LED_H ...... ...... #endif 避免重复引用头文件的内容.
- linux 系统工具集
Htop Htop是一款非常先进的交互式实时Linux进程监测工具.它非常类似Linux top命令,但是有一些丰富的功能特性,比如易于使用的界面,可用于管理进程.快捷键.进程的垂直和水平视图以及其他 ...
- WPF Tookit Chart
如何使用Chart 实例: Binding数据源中是一个KeyValuePair对象.可以是Dictionary. <charting:Chart x:Name="chtSumma ...
- [WPF系列]-TreeView的常用事项
引言 项目经常会用Treeview来组织一些具有层级结构的数据,本节就将项目使用Treeview常见的问题作一个总结. DataBinding数据绑定 DataTemplate自定义 <Hier ...
- 帆软报表FineReport中数据连接之Weblogic配置JNDI连接
1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...