2016-05-13 10 views
0

データベースからデータを読み込んでテキストファイルに出力するC#プログラムがあります。データベースから読み込むときのUTF-8エンコーディング(C#)

OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + tableName, conn); 
OleDbDataReader rdr = cmd.ExecuteReader(); 

if (rdr.HasRows) 
{ 
    while (rdr.Read()) 
    { 
     for (int i = 0; i < rdr.FieldCount; i++) 
     { 
      string toStr = rdr[i].ToString(); 

      // ...etc. 

特に1行で問題が起こり続けます。ここでは、データベース内の次のようになります。ここでは

Signed 8-bit 2’s-compliment 

は、それが私の出力ファイルに次のようになります。

Signed 8-bit 2’s-compliment 

私は考慮にエンコーディングを取ることによってこの問題を解決できることを考え出しました。その結果

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rdr[i].ToString())); 

:だから私は、UTF-8にテキストを変換するために私のコードに変更私はこれを行う場合は、しかし、

Signed 8-bit 2�s-compliment 

...

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes("Signed 8-bit 2’s-compliment")); 

を..それは完璧に動作します。

Signed 8-bit 2’s-compliment 

rdr[i].toString()とすることができますか?私の推測では、オブジェクトを文字列に変換すると、’文字のエンコーディングがねじれてしまい、アポストロフィに正しく変換できなくなってしまうのです。しかし、私はそこにtoString()の使用を避けることはできないとは思わない。では私は何をしますか?

答えて

0

問題の根はデータベースの終わりです。 SQL Serverを想定して、Collation and Unicode Supportに関するこのリンクを見てください。基本的に、あなたのデータはあなたが考えている形式で返されないかもしれません。

一般に、SQLはUTF-8ではなくUTF-16をサポートしています。つまり、データが正しく返されれば、ToString()は正しく.NET文字列がUTF-16形式でデコードされます。

また、特定の文字を特に気にしない場合は、データベースレコードを更新して、そのテキスト行に「通常の」アポストロフィを設定することができます。

関連する問題