C# 尝试检测俄语文本的编码并读取为字符串

C# 尝试检测俄语文本的编码并读取为字符串,c#,.net,C#,.net,我在网络上收到一些俄语文本。下面是这些字节的转储: 当我试图将其解释为ASCII字符串时,它当然不起作用。这似乎都不是UTF8编码。有人能帮我把这些字节读成字符串吗?(您可以看到调试器显示了它们旁边的字母) 看起来像西里尔语,代码页1251 var bytes = new byte[] { 210, 240, 224, 237, 231, 224, 234, 246, 232, 255, 32, 237, 229, 32, 236, 238, 230, 229, 242, 32, 225

我在网络上收到一些俄语文本。下面是这些字节的转储:

当我试图将其解释为ASCII字符串时,它当然不起作用。这似乎都不是UTF8编码。有人能帮我把这些字节读成字符串吗?(您可以看到调试器显示了它们旁边的字母)


看起来像西里尔语,代码页1251

var bytes = new byte[]
{
    210, 240, 224, 237, 231, 224, 234, 246, 232, 255, 32, 237, 229, 32, 236, 238, 230, 229, 242, 32, 225, 251, 242
};
var text = System.Text.Encoding.GetEncoding(1251).GetString(bytes);
// text = "Транзакция не может быт"
不确定是否有比在可用代码页上循环并查看正确内容更好的方法来解决此问题:

for (var i = 1; i < 100000; ++i)
{
    try
    {
        Console.WriteLine(System.Text.Encoding.GetEncoding(i).GetString(bytes));
        Console.WriteLine("Encoding: {0}", i);
        Console.WriteLine(System.Text.Encoding.GetEncoding(i).EncodingName);
        Console.WriteLine();
    }
    catch
    {
    }
}
for(变量i=1;i<100000;++i)
{
尝试
{
WriteLine(System.Text.Encoding.GetEncoding(i).GetString(bytes));
WriteLine(“编码:{0}”,i);
Console.WriteLine(System.Text.Encoding.GetEncoding(i).EncodingName);
Console.WriteLine();
}
抓住
{
}
}

一般来说,如果您知道在大多数情况下从何处获取文本,您就有一些关于编码的信息,因此您可以简单地使用“encoding”类,选择适当的编码并调用GetString

例如so
Encoding.UTF8.GetString()
大约
Encoding.GetEncoding(1251.GetString()


如果您没有关于编码的任何信息,那么这是另一项任务,您必须寻找一些编码检测算法

请出示您的code@StepUp:为什么是代码?代码可以简单到在这个字节数组上调用ascienceoding.GetString,或者在前一个调用中使用UTF8编码?@Damien_The_unsiever:似乎,那么,我如何将其解释为C#中的字符串?您想将俄语文本转换为ASCII吗?在本例中,似乎是代码页1251,对于代码低于128的字母,这种西里尔字母是否类似于ASCII?关于文本编码为何如此,有一段漫长而复杂的历史。阅读解释差异。我会的,但是:“对于代码低于128的字母,西里尔字母类似于ASCII吗?”大多数(如果不是全部)代码页在128以下是相同的,特定语言的字符位于更高的代码点。所以,是的,西里尔字母在128以下与ASCII相同。嗯,在我的应用程序中,我现在需要使用1251。。我用的是ASCII。。。。这对英文字母没有任何区别,对吗?对于代码低于128的字母,这是西里尔字母类似于ASCII吗?@user200312是的,这是类似的
var input = "Привет, люди!";
var utf8bytes = Encoding.UTF8.GetBytes(input);
var win1251Bytes = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("windows-1251"), utf8bytes);
File.WriteAllBytes(@"foo.txt", win1251Bytes);