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

Error string encoding (Windows 10 + Visual Studio 2015 + Net 4.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

时,此代码运行良好

我该如何解决这个问题?

您以某种方式说服了 C# 编译器您的源代码是在代码页 1251 中编写的,这是东欧和俄罗斯的默认系统代码页。这通常是由于文本文件缺少 utf-8 BOM 造成的。不清楚这是怎么发生的,也许您使用 Visual Studio 内置的文本编辑器以外的文本编辑器创建了该文件。也许它被源代码控制破坏了,具有 Unix 背景的往往会删除 BOM。

打开 Visual Studio 中的源文件并确保它仍能正确读取。然后使用文件 > 另存为,单击保存按钮上的箭头,select "with encoding" 并选择 "Unicode (UTF-8 with signature)".

还要确保默认值仍然是好的。文件 > 高级保存选项 > 必要时更改编码。如果您习惯性地使用其他文本编辑器,那么您需要对其进行配置,以便它使用 BOM 保存文件。

我有同样的问题,在我的例子中,是 ReSharper 在应用 "move class to separate file" 重构后将我的文件保存在 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;
        }
    }

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

这是 Visual Studio 2015 发行版中的一个已知错误。参见 https://github.com/dotnet/roslyn/issues/4022。它已经修复,将在下一版本的工具集 (1.1)

中提供

如果您不想更改源代码编码,可以将编码元素添加到.csproj 文件中。这对我有帮助(添加到 <PropertyGroup> 元素中):

<CodePage>1250</CodePage>

但当然只是临时 hack,对于许多项目的解决方案毫无用处。