这个让我发疯。
而上周,我希望我能做到这一点,但不幸的是……。

因此,我想为其他用户创建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/

10-12 03:36