(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
文章列表
留言列表