2010-11-26 3 views
8

私はCSVファイルにメッセージをダウンロードするためのダウンロード機能を作成しました(コードは以下です)。 は今、私はこの見++メモ帳やメモ帳でそれを開くとき:NYé作成したfiledownloadがUTF-8であることを確認するにはどうすればいいですか? (BOMのないUTF-8ではない)

をø╬║►░êö

(それはところで、データベースには何かということです)さて、とき

それは言う、

éNY私はメモ帳でそれを開くと、A╬â•++êö

を 'A-ºがâ - ':私は、MS-Excelで開くことがこのことを示しています'BOMなしのUTF8'でエンコードされています。 私は(++メモ帳で)それをエンコードUTF-8には、すべてがうまくいく(つまり、Excelがあまりにも右の文字を示している)

しかし、どのように私は私のコードから作成したファイルであることを確認することができますUTF- 8?

これは私のコードです:

public ActionResult DownloadPersonalMessages() 
{  
    StringBuilder myCsv = new StringBuilder(); 
    myCsv.Append(new DownloadService().GetPersonalMessages()); 

    this.Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "attachment; filename=PersonalMessages.csv"); 
    Response.ContentEncoding = Encoding.UTF8; 
    Response.Write(myCsv.ToString()); 
    Response.Flush(); 
    Response.HeaderEncoding = Encoding.UTF8; 
    return Content(""); 
} 

編集:

私の機能は今、この変換

UTF8Encoding encoding = new UTF8Encoding(); 
return encoding.GetBytes(str); 

ByteArrayを返し、私のダウンロードは今、このです:

Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv"); 
return File(new DownloadService().GetPersonalMessages(), "text/csv"); 

答えて

3

UTF8Encodingクラスを試してみるとよいでしょう。コンストラクタには、BOMを提供するかどうかを決定するパラメータがあります。おそらく、GetBytesメソッドを使用して文字列をレスポンスの一連のバイトとして書き出し、それを.net文字列オブジェクトに変換し直す必要があります。

+1

ありがとう、私のコードをSystem.Text.UTF8Encodingに変更しました。encoding = new System.Text.UTF8Encoding(true);しかしまだ運がありません... – Michel

+0

あなたはgetbytesとすべてによって正しいトラックに私を設定しました。私は間違ったトラックにいたので、notepad ++はutf8ではなく、utf8に変換するとうまくいきました。もちろん、私の側ではutf8は必須条件ではありませんでした。私はunicodeencodingとtadaaでそれを試しました!出来た。あなたの考えをありがとう。 – Michel

+1

FYI:何らかの理由により、コンストラクタパラメータが実際にBOMを出力することはありません。 '.GetPreamble()'の結果を手動で前に追加する必要があります。 – StriplingWarrior

1

あなたはあなたのコードを少し簡略化することができます:

public ActionResult DownloadPersonalMessages() 
{ 
    StringBuilder myCsv = new StringBuilder(); 
    myCsv.Append(new DownloadService().GetPersonalMessages()); 
    Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv"); 
    return File(Encoding.UTF8.GetBytes(myCsv.ToString()), "text/csv"); 
} 

限りUTF-8エンコーディングは、私は問題はこのGetPersonalMessages方法であるかもしれない怖い懸念しています。ファイルとして直接返すことができるストリームまたはバイト配列を返す必要があるかもしれません。

+0

それを試みます。そして、コードはすべて異なるものを試すことによって大きくなった:) – Michel

+0

ええと、私はバイト配列を返すとき、それはUTF8になりますか?うーん、試してみるよ。 GetPersonalMessgages()関数はデータベースbtwからnvarcharフィールドを読み込みます – Michel

18

ザレスの答えがOPを助けましたが、実際に質問には答えませんでした。あなたはUTF8を使用しているという事実にして手がかり特定のプログラム(例えばエクセル> 2007)(技術的にUTF8に必要ないが)

public ActionResult Download() 
{ 
    var data = Encoding.UTF8.GetBytes("some data"); 
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray(); 
    return File(result, "application/csv", "foo.csv"); 
} 

バイト順マーク:ここthis other postから正しい解決策は、です。 GetPreamble()メソッドを使用して手動で含める必要があります。