2012-02-21 1 views
0

UTF-8エンコードされたフィールド(varchar)を返すMS SQLクエリがあります。それを.NET Unicode文字列に変換するにはどうすればよいですか? UTF8Encoding.GetStringは、バイト配列を持っていれば仕事をしますが、私はそうしません。DataReaderのUTF-8からC#までの文字列

+6

あなたは何バイト持っていますか?文字列の場合は、データベースまたはADO.NETプロバイダによって既にデコードされている可能性があります。 –

+0

あなたは何を持っていますか? SQL文字列を.NET文字列に変換する必要はないと思います。 –

+0

これはvarchar ...だからdatareaderまでの文字列 – Rob

答えて

0

はこの質問から可能な解決策を適応:C# Convert string from UTF-8 to ISO-8859-1 (Latin1) H

var dbEnc = Encoding.UTF8; 
var uniEnc = Encoding.Unicode; 
byte[] dbBytes = dbEnc.GetBytes(dbString); 
byte[] uniBytes = Encoding.Convert(dbEnc, uniEnc, dbBytes); 
string msg = uniEnc.GetString(uniBytes); 

は、このヘルプをしていますか?

+0

私は問題は、プロバイダからフェッチされた文字列が既に混乱していることだと思います。 – Rob

+1

Hmm。 DbDataReader.GetBytes(...)を使用してデータをバイト配列に読み込む方法はありますか?また、データベースに何が入るのかを制御できますか? それは、例えばDBデータとして、詳細およびコンテキストにあなたの質問を更新する価値があるかもしれ、あなたの現在のコードと端から出力される電流は、あなたが達成したいつながります。 – raveturned

+0

私はオフィスに戻ったときにこれを行かせます。 – Rob

1

良い開始点:http://msdn.microsoft.com/en-us/library/kdcak6ye.aspx 元の文字列のバイト数を取得するには、System.Text.Encoding.UTF8.GetBytes()メソッドを使用します。

+0

ええと...文字列をバイト配列にエンコードし、それを再び文字列にデコードすることを提案しています可能な目的は何ですか? –

+0

文字列から各文字を取り出し、それを使ってバイト配列を設定しようとしました。これは、ハイビット文字が既にUnicodeに対応していたため機能しませんでした。 – Rob

+0

@Rob _Why_それを試しましたか?なぜ文字列をそのまま使うことができないのですか?あなたが話していない特定の問題はありますか? –

2

私はthe MSDN forumsから学んだことを適用しました。クエリは、varchar、UTF-8エンコードされたテキスト、datetimeおよびintの値を返します。私は結果からCSVファイルを構築しています。

using (var sw = new StreamWriter(txtOutputFile, true, Encoding.UTF8)) 
{ 
    while (r.Read()) 
    { 
    var colCount = r.FieldCount; 
    var curCol = 1; 

    var utf8 = new UTF8Encoding(); 
    var row = ""; 

    if (r[0].GetType() == typeof(SqlString)) 
    { 
     SqlString sqlString = r.GetSqlString(0); 
     Byte[] encodedBytes = sqlString.GetNonUnicodeBytes(); 
     row = "\"" + utf8.GetString(encodedBytes) + "\""; 
    } 
    else 
    { 
     row = "\"" + r[0].ToString() + "\""; 
    } 

    while (curCol < colCount) 
    { 
     if (r[curCol].GetType() == typeof(SqlString)) 
     { 
     SqlString sqlString = r.GetSqlString(curCol); 
     Byte[] encodedBytes = sqlString.GetNonUnicodeBytes(); 
     row += ",\"" + utf8.GetString(encodedBytes) + "\""; 
     } 
     else 
     { 
     row += ",\"" + r[curCol].ToString() + "\""; 
     } 
     curCol += 1; 
    } 

    sw.WriteLine(row); 
    } 

} 
2

あなたがその内容UTF-16エンコードされていると誤って解釈されるC#stringを持っている場合、あなたは根本的なバイト再解釈できます:あなたはSqlDataReaderへのアクセス権を持っている場合は、しかし、

public static string InterpretAsUTF8(string value) 
{ 
    byte[] rawData = Encoding.Default.GetBytes(value); 
    string reencoded = Encoding.UTF8.GetString(rawData); 
    return reencoded; 
} 

を@CarlSteffenのように、あなたはこれを行うことができます:

//Assuming the column index you're interested in is 1: 
SqlString utf8EncodedString = reader.GetSqlString(1); 
string expectedResult = Encoding.UTF8.GetString(utf8EncodedString.GetNonUnicodeBytes()); 
関連する問題