Domanda

Sto avendo un problema con UTF8 codifica nel mio asp.net mvc 2 applicazione in C #. Sto cercando utente let scaricare un semplice file di testo da una stringa. Sto cercando di ottenere byte array con la seguente riga:

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

, ma quando torno per scaricare utilizzando:

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

ottengo un file che è senza BOM in modo da non ottengo caratteri croati visualizzati correttamente. Questo perché la matrice di byte non include BOM dopo la codifica. I Triend inserendo tali byte manualmente e poi mostra correttamente, ma non è il modo migliore per farlo.

Ho anche cercato di creare un'istanza di classe UTF8Encoding e passando un valore booleano (vero) per il costruttore per includere distinta, ma non funziona neanche.

Chiunque ha una soluzione? Grazie!

È stato utile?

Soluzione

Prova in questo modo:

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

Il motivo è che il costruttore UTF8Encoding che prende un parametro booleano non fa quello che ci si aspetta:

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

La matrice risultante conterrà un singolo byte con il valore di 97. Non c'è BOM UTF8 perché non richiede una distinta base.

Altri suggerimenti

Ho creato una semplice estensione per convertire qualsiasi stringa in qualsiasi codifica per la sua rappresentazione di array di byte quando viene scritto in un file o flusso:

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

Utilizzo:

stringValue.ToBytes(Encoding.UTF8)

Questo funziona anche per le altre codifiche, come UTF-16 che richiede la distinta base.

UTF-8 non richiede una distinta, perché è una sequenza di parole 1 byte. UTF-8 = UTF-8BE = UTF-8LE.

Al contrario, UTF-16 richiede un BOM all'inizio del flusso per identificare se il resto del flusso è UTF-16 BE o UTF-16, perché UTF-16 è una sequenza di parole di 2 byte e del BOM identifica se i byte le parole sono BE o lE.

Il problema non si trova con la classe Encoding.UTF8. Le bugie problema con qualunque programma che si sta utilizzando per visualizzare i file.

Ricordate che le stringhe NET sono tutti unicode mentre c'è soggiorno in memoria, quindi se è possibile vedere il vostro csvString correttamente con il debugger il problema sta scrivendo il file.

A mio parere si dovrebbe restituire un FileResult con la stessa codifica che i file. Prova a impostare la codifica del file di ritorno,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top