Comment m'assurer que mes créé filedownload est UTF-8? (et pas en UTF-8 sans BOM)
j'ai fait une fonction de téléchargement pour télécharger les messages vers un fichier CSV (le code est ci-dessous).
Maintenant quand je l'ouvre dans le bloc-notes ou notepad++, je vois ceci:
é NY ø ╬ ║ ► ° de la ê ö
(et c'est ce qui est dans la base de données btw)
Maintenant, quand je l'ouvre dans Ms-Excel, il indique ceci:
é NY à ╠║▼ ░ ê ö
Quand je l'ai ouvert dans notepad++, il dit que c'est codé en "UTF8 sans BOM'.
Quand je l'encode (dans notepad++) en UTF-8, tout va bien (c'est, Excel affiche le droit caractères trop)
Mais comment puis-je m'assurer que le fichier que j'ai créer à partir de mon code est en UTF-8?
C'est mon code:
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("");
}
Edit:
ma fonction retourne maintenant un ByteArray
avec cette conversion
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(str);
et mon téléchargement est maintenant ceci:
Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
return File(new DownloadService().GetPersonalMessages(), "text/csv");
OriginalL'auteur Michel | 2010-11-26
Vous devez vous connecter pour publier un commentaire.
Vous pourriez vouloir essayer à l'aide de la UTF8Encoding classe. Le constructeur a un paramètre qui détermine si elle doit fournir la NOMENCLATURE ou non. Vous aurez probablement à utiliser le GetBytes-méthode et d'écrire la chaîne de caractères comme une série d'octets dans la réponse, et non la convertir en un .net objet de type string.
vous avez mis en moi sur la bonne voie par la getbytes et tous. J'étais sur la mauvaise voie, car notepad++ a dit que c'était une utf8 pas de nomenclature fichier, et quand je l'ai converti en utf8, il a travaillé. Mais bien sûr utf8 n'était pas une exigence de mon côté. Je l'ai essayé avec un unicodeencoding et tadaa! il a travaillé. Merci pour votre pensée.
Pour info: Pour une raison quelconque, le paramètre du constructeur n'est pas réellement la cause à la sortie de la NOMENCLATURE. Vous devez préfixer le résultat de
.GetPreamble()
manuellement.OriginalL'auteur Zareth
Zareth l'a aidé à répondre à l'OP, mais il n'a pas fait de répondre à la question. Voici la bonne solution, à partir de cet autre post:
La marque d'ordre d'octet (bien que pas techniquement nécessaire pour UTF8) indices certains programmes (par exemple, Excel >2007) dans le fait que vous êtes à l'aide de l'UTF8. Vous devez inclure manuellement par l'intermédiaire de l'
GetPreamble()
méthode.text/csv
, voir ici (et si vous voulez être plus précis alors utiliser:text/csv; charset=utf-8
, voir ici).Je pense que cela dépend de l'intention. d'Après ce DONC post, "Si un serveur dit" de ces données est de type text/csv "le client peut comprendre que peut rendre que des données à l'interne, tandis que si le serveur dit" de ces données est de type application/csv " le client sait qu'il a besoin de lancer l'application qui est enregistré sur le système d'exploitation pour ouvrir les fichiers csv." Si vous souhaitez que le navigateur pour lancer Excel, puis "application/csv" est probablement mieux. Bien sûr, si vous êtes à l'aide de content-disposition pour rendre le téléchargement de fichier, puis que c'est le genre de sujet à controverse.
OriginalL'auteur StriplingWarrior
Vous pouvez simplifier votre code un peu:
Autant que le codage UTF-8, je crains que le problème pourrait être dans cette
GetPersonalMessages
méthode. Vous pourriez avoir besoin de retourner un flux ou un tableau d'octets qui pourrait vous retourner directement en tant que fichier.hmm, quand je retourne un tableau d'octets, fera que rendre UTF8? Wll, je vais faire un essai. Le GetPersonalMessgages() fonction lit un champ de type nvarchar à partir de la base de données btw
OriginalL'auteur Darin Dimitrov