这个让我发疯。
而上周,我希望我能做到这一点,但不幸的是……。
因此,我想为其他用户创建CSV下载文件以在MS-Word中打开(他们想要CSV格式)
所以我最终在MVC2 Controller 中得到以下代码:
Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
Response.ContentType = "application/csv";
string s = new DownloadService().GetAddresses();
Response.Write(s);
Response.End();
return null;
字符串“s”包含(除其他信息外)以下字符:éåæÉà
当我在记事本中打开它时:确定
当我在 Notepad++ 中打开它时:好的
当我在Excel中打开它时:不好,它表明:åæÉÃ
(当我在Notepadd++中打开它时,它说它是不带BOM的UTF8编码,无论我尝试在构造函数中使用带 bool 值的UTF8编码来获取BOM的方法,都没有解决)
所以我上周问了一个问题,答案是让GetAddresses()函数返回一个字节数组。
所以我确实使用以下方法转换了文本:
// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
return encoding.GetBytes(str);
}
,并在响应中写入了字节数组,一切都很好!记事本,notepad++和Excel!
太好了,住的还不错。
但是后来我发现他们正在用Word打开文件。好吧,我认为没有问题。
但是,它们对他们有所帮助:Word无法(直接)打开文件,要求首先编码,这是一个问题,因为他们在自动化过程中使用它。
当他们在记事本中打开文件并将其另存为unicode时,一切顺利。
我也在 Action 方法中尝试过此操作:
Response.ContentEncoding = Encoding.Unicode ;
Response.HeaderEncoding = Encoding.UTF8;
但这无济于事。
有人有任何线索吗?
最佳答案
尝试使用ISO-8859-1
而不是UTF-8
:
public ActionResult Index()
{
var encoding = Encoding.GetEncoding("iso-8859-1");
var data = encoding.GetBytes("éåæÉà;some other value");
return File(data, "application/csv", "PersonalMessages.csv");
}
还请注意
FileResult
的略微简化和用法。我建议您的另一种可能性是显式地附加前言,以便Excel可以识别UTF-8编码:
public ActionResult Index()
{
var data = Encoding.UTF8.GetBytes("éåæÉà;some other value");
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(result, "application/csv;charset=utf-8", "PersonalMessages.csv");
}
关于c# - (简单)带有特殊字符的CSV下载使我发疯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4374707/