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 ...
随机推荐
- Linux vi/vim(转载)
Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...
- python之面向对象与构造函数
一.面向对象介绍 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式, 当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向过程编程 ...
- 请问utf-8的中文是一个汉字占三个字节长度吗?
这是个好问题,可以当作一个笔试题.先从字符编码讲起. 1.美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0: 2.后来欧洲人发现尼 ...
- ORA-14450: attempt to access a transactional temp table already in use
在ORACLE数据中修改会话级临时表时,有可能会遇到ORA-14550错误,那么为什么会话级全局临时表会报ORA-14450错误呢,如下所示,我们先从一个小小案例入手: 案例1: SQL> CR ...
- URL无法显示某些特殊符号
URL无法显示某些特殊符号,这个时候就要使用编码了.编码的格式为:一个百分号,后面跟对应字符的ASCII(16进制)码值.例如 空格的编码值是"%20".(ASCII参考)URL中 ...
- linux快速删除海量文件
首先创建一个临时目录: /rubbish rsync --delete-before -a -H -v --progress --stats /rubbish /111 /111为目的目录 选项说明: ...
- PostgreSQL-角色、库、模式、表
由于不了解postgresql的psql工具,安装完数据库后就直接用pgadmin或navicat来连接操作,在确认初始化后的库中默认有些什么东西后竟然一直无处下手,在还没有了解pg大致体系的情况下搞 ...
- linux文件拼接命令 paste
paste [文件名1 [文件名2] --] [选项] -s 把文件以行的方式拼接 -d 制定分隔符,默认以制表符分隔 [root@dagege ~]# >.txt [root@dagege ~ ...
- EcmaScript相关文档
ecmascript5.1中文文档 ECMAScript 6入门 JavaScript 标准参考教程 ECMAScript 5.1简介 ES5中新增的Array方法详细说明 firefox社区java ...
- linux shell 变量