Question

Je suis un problème avec UTF8 encodage dans mon asp.net mvc 2 application en C #. J'essaie let utilisateur de télécharger un fichier texte à partir d'une chaîne. Je suis en train d'obtenir octets tableau avec la ligne suivante:

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

mais quand je retourne pour téléchargement en utilisant:

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

je reçois un fichier qui est sans nomenclature, donc je ne reçois pas les caractères croates affichés correctement. Ceci est parce que mon tableau d'octets ne comprend pas de nomenclature après l'encodage. Je triend insérer les octets manuellement et il affiche correctement, mais ce n'est pas la meilleure façon de le faire.

J'ai aussi essayé de créer une instance de classe de UTF8Encoding et passer une valeur booléenne (true) à son constructeur d'inclure la nomenclature, mais il ne fonctionne pas non plus.

Quelqu'un a une solution? Merci!

Était-ce utile?

La solution

Essayez comme ceci:

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

La raison en est que le constructeur de UTF8Encoding qui prend un paramètre booléen ne fait pas ce que vous attendez:

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

Le tableau résultant contiendra un seul octet avec la valeur de 97. Il n'y a pas de nomenclature parce que UTF8 ne nécessite pas une nomenclature.

Autres conseils

Je créé une simple extension pour convertir une chaîne dans un encodage à sa représentation du tableau d'octets quand il est écrit dans un fichier ou un flux:

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

Utilisation:

stringValue.ToBytes(Encoding.UTF8)

Cela fonctionne aussi pour d'autres encodages comme UTF-16 qui nécessite la nomenclature.

UTF-8 ne nécessite pas une nomenclature, car il est une séquence de mots de 1 octet. UTF-8 = UTF-8BE = UTF-8LE.

En revanche, UTF-16 exige une nomenclature au début du flux afin de déterminer si le reste du courant est UTF-16BE ou UTF-16LE, parce que UTF-16 est une séquence de mots de 2 octets et la nomenclature identifie si les octets sont les mots BE ou lE.

Le problème ne réside pas dans la classe Encoding.UTF8. Le problème réside dans tout programme que vous utilisez pour afficher les fichiers.

Rappelez-vous que les chaînes .NET sont tous unicode tout séjour dans cet hôtel en mémoire, donc si vous pouvez voir correctement votre csvString avec le débogueur le problème est en train d'écrire le fichier.

À mon avis, vous devriez retourner un FileResult avec le même encodage que les fichiers. Essayez de régler l'encodage du fichier de retour,

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top