Frage

ich habe ein Problem mit UTF8-Codierung in meinem asp.net MVC 2-Anwendung in C #. Ich versuche, let Benutzer eine einfache Textdatei aus einem String herunterladen. Ich versuche, mit der folgenden Zeile Bytes Array zu erhalten:

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

aber wenn ich zurückkehre es zum Download mit:

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

ich eine Datei erhalten, die ohne BOM ist so ich kroatisch Zeichen nicht korrekt angezeigt bekommen. Dies liegt daran, mein Bytes Array nicht BOM enthält nach der Codierung. Ich triend Einfügen diejenigen Bytes manuell und dann zeigt es korrekt, aber das ist nicht der beste Weg, es zu tun.

Ich habe auch versucht UTF8Encoding Klasseninstanz zu schaffen und einen Booleschen Wert (true) an seinen Konstruktor BOM enthalten, aber es funktioniert auch nicht.

Wer hat eine Lösung? Dank!

War es hilfreich?

Lösung

Versuchen Sie wie folgt aus:

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

Der Grund dafür ist, dass der UTF8Encoding Konstruktor, der einen Booleschen Parameter nimmt nicht tut, was man erwarten würde:

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

Das resultierende Array ein einzelnes Byte mit dem Wert von 97 enthalten würde Es gibt keine BOM weil UTF8 keine BOM erforderlich.

Andere Tipps

I erstellt eine einfache Erweiterung beliebige Zeichenfolge in jeder Codierung auf seine Darstellung von Byte-Array zu konvertieren, wenn es auf eine Datei oder einen Stream geschrieben wird:

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

Verbrauch:

stringValue.ToBytes(Encoding.UTF8)

Das funktioniert auch für andere Codierungen wie UTF-16, die die Stückliste erforderlich ist.

UTF-8 keine BOM erforderlich, da es sich um eine Folge von 1-Byte-Worte. UTF-8 = UTF-8BE = UTF-8LE.

Im Gegensatz dazu UTF-16 erfordert eine BOM zu Beginn des Stroms zu ermitteln, ob der Rest des Stroms UTF-16BE oder UTF-16LE ist, weil UTF-16 eine Folge von 2-Byte-Worten ist und die BOM identifiziert, ob der Bytes in den Worten sind BE oder LE.

Das Problem liegt nicht bei der Encoding.UTF8 Klasse. Das Problem liegt mit dem, was von Ihnen verwendete Programm die Dateien anzuzeigen.

Beachten Sie, dass .NET-Strings sind alle Unicode während es Aufenthalts in Erinnerung, wenn Sie also Ihren csvString richtig mit dem Debugger sehen können das Problem die Datei schreibt.

Meiner Meinung nach sollten Sie eine FileResult mit der gleichen Codierung zurückgeben, dass die Dateien. Versuchen Sie, die Rückkehr Datei-Codierung Einstellung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top