字符串编码错误(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,对于许多项目的解决方案毫无用处。
我的代码:
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,对于许多项目的解决方案毫无用处。