C#中的西里尔语编码

use*_*301 10 c# sql-server encoding

我在MSSQL数据库中有一堆类似西里尔文的文本,需要在C#中将其转换为Cyrillic.

所以...Ðàáîòàâãðìàíèè

应该成为

Работавгермании

有什么建议?

我应该补充说,我最接近的是?aaioa aa?iaiee

这是我正在使用的代码:

 str = Encoding.UTF8.GetString(Encoding.GetEncoding("Windows-1251").GetBytes(drCurrent["myfield"].ToString()));
 str = Encoding.GetEncoding(1251).GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), Encoding.UTF8.GetBytes(str)));
Run Code Online (Sandbox Code Playgroud)

M. *_*ara 17

// To find out source and target
const string source = "Ðàáîòà â ãåðìàíèè";
const string destination = "?????? ? ????????";

foreach (var sourceEncoding in Encoding.GetEncodings())
{

    var bytes = sourceEncoding.GetEncoding().GetBytes(source);
    foreach (var targetEncoding in Encoding.GetEncodings())
    {
        if (targetEncoding.GetEncoding().GetString(bytes) == destination)
        {
            Console.WriteLine("Source Encoding: {0} TargetEncoding: {1}",sourceEncoding.CodePage,targetEncoding.CodePage);
        }

    }
}

// Result1: Source Encoding: 1252 TargetEncoding: 1251
// Result2: Source Encoding: 28591 TargetEncoding: 1251
// Result3: Source Encoding: 28605 TargetEncoding: 1251

// The code for you to use 
var decodedCyrillic = Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(1252).GetBytes(source));
// Result: ?????? ? ????????
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 5

ADO.Net 将 SQL Server 提供程序中的所有字符串类型公开为 C# 字符串,这意味着它们已经转换为 Unicode。对于非 unicode 源列(显然是您的),例如char(n)varchar(n),ADO.Net SQL Server 提供程序使用源排序规则信息来确定编码。因此,如果您的非 unicode SQL Server 数据在 .Net 中以错误的编码表示,则它一定是以错误的排序规则呈现给提供程序的。为您的数据选择适当的排序规则,SQL Server 的 ADO.Net 提供程序将使用适当的编码对其进行转换。例如,如排序规则和代码页体系结构中所述,西里尔字母排序规则将生成代码页 1251,这很可能正是您想要的。链接的文章包含解决问题所需的所有信息。

\n\n
using System;\nusing System.Text;\nusing System.Data.SqlClient;\nusing System.Windows.Forms;\n\npublic class Hello1\n{\n   public static void Main()\n   {\n    try\n    {\n        using (SqlConnection conn = new SqlConnection("server=.;integrated security=true"))\n        {\n            conn.Open ();\n\n            // The .cs file must be saved as Unicode, obviously...\n            //\n            string s = "\xd0\xa0\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xb2 \xd0\xb3\xd0\xb5\xd1\x80\xd0\xbc\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb8"; \n\n            byte[] b = Encoding.GetEncoding(1251).GetBytes (s);\n\n            // Create a test table\n            //\n            SqlCommand cmd = new SqlCommand (\n                @"create table #t (\n                    c1 varchar(100) collate Latin1_General_CI_AS, \n                    c2 varchar(100) collate Cyrillic_General_CI_AS)", \n                conn);\n            cmd.ExecuteNonQuery ();\n\n            // Insert the same value twice, the original Unicode string\n            // encoded as CP1251\n            //\n            cmd = new SqlCommand (\n                @"insert into #t (c1, c2) values (@b, @b)", conn);\n            cmd.Parameters.AddWithValue("@b", b);\n            cmd.ExecuteNonQuery ();\n\n            // Read the value as Latin collation \n            //\n            cmd = new SqlCommand (\n                @"select c1 from #t", conn);\n            string def = (string) cmd.ExecuteScalar ();\n\n            // Read the same value as Cyrillic collation\n            //\n            cmd = new SqlCommand (\n                @"select c2 from #t", conn);\n            string cyr = (string) cmd.ExecuteScalar ();\n\n            // Cannot use Console.Write since the console is not Unicode\n            //\n            MessageBox.Show(String.Format(\n                @"Original: {0}  Default collation: {1} Cyrillic collation: {2}", \n                    s, def, cyr));\n        }\n\n    }\n    catch(Exception e)\n    {\n        Console.WriteLine (e);\n    }   \n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:

\n\n
---------------------------\n\n---------------------------\nOriginal: \xd0\xa0\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xb2 \xd0\xb3\xd0\xb5\xd1\x80\xd0\xbc\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb8  Default collation: \xc3\x90\xc3\xa0\xc3\xa1\xc3\xae\xc3\xb2\xc3\xa0 \xc3\xa2 \xc3\xa3\xc3\xa5\xc3\xb0\xc3\xac\xc3\xa0\xc3\xad\xc3\xa8\xc3\xa8 Cyrillic collation: \xd0\xa0\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xb2 \xd0\xb3\xd0\xb5\xd1\x80\xd0\xbc\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb8\n---------------------------\nOK   \n---------------------------\n
Run Code Online (Sandbox Code Playgroud)\n