59

C# の asp.net mvc 2 アプリケーションで UTF8 エンコーディングに問題があります。ユーザーが文字列から単純なテキストファイルをダウンロードできるようにしようとしています。次の行でバイト配列を取得しようとしています:

var x = Encoding.UTF8.GetBytes(csvString);

しかし、私がダウンロードのためにそれを返すとき:

return File(x, ..., ...);

BOM のないファイルを取得したため、クロアチア語の文字が正しく表示されません。これは、バイト配列にエンコード後の BOM が含まれていないためです。これらのバイトを手動で挿入しようとすると、正しく表示されますが、それは最善の方法ではありません。

また、UTF8Encoding クラス インスタンスを作成し、そのコンストラクターにブール値 (true) を渡して BOM を含めようとしましたが、どちらも機能しません。

誰にも解決策がありますか?ありがとう!

4

4 に答える 4

147

このようにしてみてください:

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");
}

その理由は、ブール値のパラメーターを取る UTF8Encoding コンストラクターが期待どおりに動作しないためです。

byte[] bytes = new UTF8Encoding(true).GetBytes("a");

結果の配列には、値が 97 の 1 バイトが含まれます。UTF8 は BOM を必要としないため、BOM はありません。

于 2010-12-10T23:11:08.007 に答える
20

ファイルまたはストリームに書き込まれるときに、任意のエンコーディングの任意の文字列をバイト配列の表現に変換する簡単な拡張機能を作成しました。

public static class StreamExtensions
{
    public static byte[] ToBytes(this string value, Encoding encoding)
    {
        using (var stream = new MemoryStream())
        using (var sw = new StreamWriter(stream, encoding))
        {
            sw.Write(value);
            sw.Flush();
            return stream.ToArray();
        }
    }
}

使用法:

stringValue.ToBytes(Encoding.UTF8)

これは、BOM を必要とする UTF-16 などの他のエンコーディングでも機能します。

于 2015-06-15T07:28:16.653 に答える
2

UTF-8 は 1 バイトの単語のシーケンスであるため、BOM は必要ありません。UTF-8 = UTF-8BE = UTF-8LE。

対照的に、UTF-16 はストリームの先頭に BOM を必要とし、ストリームの残りが UTF-16BE か UTF-16LE かを識別します。これは、UTF-16 が 2 バイトの単語のシーケンスであり、BOM がワード内のバイトは BE または LE です。

Encoding.UTF8問題はクラスにあるのではありません。問題は、ファイルを表示するために使用しているプログラムにあります。

于 2010-12-10T23:11:19.097 に答える
-2

.NET 文字列はメモリ内にある間はすべてユニコードであるため、デバッガーで csvString を正しく表示できる場合、ファイルの書き込みに問題があることに注意してください。

FileResult私の意見では、ファイルと同じエンコーディングで を返す必要があります。返されるファイルエンコーディングを設定してみてください。

于 2010-12-10T23:12:25.057 に答える