11

MSSQL データベースにキリル文字のようなテキストがたくさんあり、C# でキリル文字に変換する必要があります。

So... Ðàáîòà â ãåðìàíèè

なるべき

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

助言がありますか?

私が得た最も近いものは ?aaioa a 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)));
4

2 に答える 2

22
// 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: Работа в германии
于 2012-08-17T22:52:25.827 に答える
4

ADO.Net は、SQL Server プロバイダーからのすべての文字列型を C# 文字列として公開します。これは、既に Unicode に変換されていることを意味します。または のような非 Unicode ソース列 (明らかにそうであるように) のchar(n)場合varchar(n)、ADO.Net SQL Server プロバイダーはソース照合情報を使用してエンコードを決定します。したがって、Unicode 以外の SQL Server データが間違ったエンコーディングで .Net に表示される場合は、間違った照合順序でプロバイダーに提示されたに違いありません。データに適切な照合順序を選択すると、SQL Server 用の ADO.Net プロバイダーが適切なエンコーディングを使用して変換します。たとえば、Collat​​ion and Code Page Architectureに記載されているように、キリル文字の照合はコード ページ 1251になります。、これはあなたが望むものである可能性が非常に高いです。リンクされた記事には、問題を解決するために必要なすべての情報が含まれています。

using System;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

public class Hello1
{
   public static void Main()
   {
    try
    {
        using (SqlConnection conn = new SqlConnection("server=.;integrated security=true"))
        {
            conn.Open ();

            // The .cs file must be saved as Unicode, obviously...
            //
            string s = "Работа в германии"; 

            byte[] b = Encoding.GetEncoding(1251).GetBytes (s);

            // Create a test table
            //
            SqlCommand cmd = new SqlCommand (
                @"create table #t (
                    c1 varchar(100) collate Latin1_General_CI_AS, 
                    c2 varchar(100) collate Cyrillic_General_CI_AS)", 
                conn);
            cmd.ExecuteNonQuery ();

            // Insert the same value twice, the original Unicode string
            // encoded as CP1251
            //
            cmd = new SqlCommand (
                @"insert into #t (c1, c2) values (@b, @b)", conn);
            cmd.Parameters.AddWithValue("@b", b);
            cmd.ExecuteNonQuery ();

            // Read the value as Latin collation 
            //
            cmd = new SqlCommand (
                @"select c1 from #t", conn);
            string def = (string) cmd.ExecuteScalar ();

            // Read the same value as Cyrillic collation
            //
            cmd = new SqlCommand (
                @"select c2 from #t", conn);
            string cyr = (string) cmd.ExecuteScalar ();

            // Cannot use Console.Write since the console is not Unicode
            //
            MessageBox.Show(String.Format(
                @"Original: {0}  Default collation: {1} Cyrillic collation: {2}", 
                    s, def, cyr));
        }

    }
    catch(Exception e)
    {
        Console.WriteLine (e);
    }   
   }
}

結果は次のとおりです。

---------------------------

---------------------------
Original: Работа в германии  Default collation: Ðàáîòà â ãåðìàíèè Cyrillic collation: Работа в германии
---------------------------
OK   
---------------------------
于 2012-08-17T22:41:48.843 に答える