错误字符串编码(Windows 10 + Visual Studio 2015 + .Net 4.6)

6

我的代码:

Keys = new Dictionary<string, string>();
Keys.Add("Набег_0", "raid_0");

当我获取Keys.ElementAt(0)时,我得到了这个:{[Íàáåã_0, raid_0]}。当然,在运行程序时,key = "Набег_0"未定义,并且程序会崩溃并显示System.Collections.Generic.KeyNotFoundException。
在Windows 8.1 + Visual Studio 2013 + .net 3.5环境中可以正常工作的代码。
我该如何解决这个问题?

听起来你一直有这个 bug。不知何故,键Íàáåã_0在元素零而不是Ha6er_0。 - jdweng
密钥是用俄语编写的。目标是获取英文含义。在升级到Windows 10 + .Net 4.6 + Visual Studio 2015之前,代码完美运行。显然新的Visual Studio不再理解俄语了。可以怪罪于Windows或.Net。我不想改变所有手册的英语语言,因为这将需要对程序进行很多更改。 P.S. 对于自动翻译表示抱歉。 - lantsev1981
1
这是编码问题。看起来你有Unicode字符。流类默认使用ASCII编码。看起来你需要在其中一个类中指定Unicode编码。 - jdweng
我有同样的问题。当文件不是UTF-8编码时,Windows10/VisualStudio2015会认为该文件具有错误的编码。一切看起来都很正常,直到我编译应用程序。 - Jernej Novak
5个回答

6
你成功地说服了C#编译器,让它认为你的源代码是使用1251代码页编写的,这是东欧和俄罗斯的默认系统代码页。通常这是由于文本文件缺少utf-8 BOM引起的。不清楚这是怎么发生的,可能是你使用了除Visual Studio内置编辑器以外的文本编辑器创建了该文件。也可能是源代码控制工具弄乱了它,那些具有Unix背景的工具 tend to drop the BOM。
在Visual Studio中打开源文件并确保其仍然可以正确读取。然后使用“文件”>“另存为”,单击“保存”按钮上的箭头,选择“使用编码”并选择“Unicode(带签名的UTF-8)”。
还要确保默认设置仍然正确。文件>高级保存选项>根据需要更改编码。如果你习惯使用其他文本编辑器,则需要配置它以便它保存带有BOM的文件。

重新以 UTF-8 格式保存文件有所帮助,但仍不清楚为什么所有文件都是 ANSI 编码。可能是 TFS 导致的。现在我必须浏览所有文件以查找 UTF-8 编码,并修改工程... 非常感谢您的帮助! - lantsev1981
即使使用1251代码页中的文件,在Visual Studio 2015之前它也能够完美运行。正如下一个答案所提到的那样,这似乎是Visual Studio中的一个错误。 - tyger

5

我有同样的问题,我的情况是在应用“将类移动到单独的文件”重构后,ReSharper将我的文件保存为windows-1251。

我使用了这个测试来将我仓库中的所有cs文件转换为UTF-8。

    [Test]
    public void UpdateEncoding()
    {
        string path = @"C:\dev\Cash\src";
        foreach (var file in Directory.GetFiles(path, "*.cs", SearchOption.AllDirectories))
        {
            if (HasBom(file))
                continue;

            Console.WriteLine(file);

            var content = File.ReadAllText(file, Encoding.GetEncoding("windows-1251"));
            File.WriteAllText(file, content, Encoding.UTF8);
        }
    }

    private bool HasBom(string file)
    {
        using (var strm = new FileStream(file, FileMode.Open))
        {
            foreach (var b in Encoding.UTF8.GetPreamble())
            {
                if (strm.ReadByte() != b)
                    return false;
            }

            return true;
        }
    }

我不确定,但清除Resharper缓存可能有助于解决这个问题。 - chromigo

4

4
如果您不想更改源代码编码,您可以将编码元素添加到.csproj文件中。这对我很有帮助(添加到<PropertyGroup>元素中): <CodePage>1250</CodePage> 但是,这只是一个临时的hack,对于有许多项目的解决方案无用。

这个hack会导致我的Visual Studio设计器出现“找不到类型”错误而崩溃。 - Antonín Lejsek
1
我强烈建议更新到修复这个恼人的 bug 的 Update 1 RC 版本(版本号为14.0.24627.00)。 - vasek

0

我也遇到了一个本地项目的问题,在Win8.1/VS2013中完美运行。所以这与TFS或任何其他存储库无关。 重新保存为UTF-8有帮助。 此外,我有一个俄语本地化的Visual Studio,通过语言包更新为英语(讨厌本地化的IDE和MSDN)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接