(简单)带有特殊字符的CSV下载让我疯狂

时间:2010-12-07 08:33:12

标签: c# asp.net-mvc encoding character-encoding download

这个让我疯了。 上周我知道我破解了坚果,但遗憾的是没有....

所以我想创建一个CSV下载供其他用户在MS-Word中打开(他们想要CSV格式)

所以我最终在MVC2控制器中使用了这段代码:

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编码,无论我在构造函数中使用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);
}

,并在响应中写入了字节数组,一切都很好!记事本,记事本++和Excel! 很棒,生活很好。

但后来我发现他们在Word中打开文件。好吧,我没想过。

但是他们帮助:Word无法打开文件(直接),它首先要求编码,这是一个问题,因为他们在自动化过程中使用它。

当他们在记事本中打开文件并将其保存为unicode时,一切顺利。

我也在动作方法中试过这个:

Response.ContentEncoding = Encoding.Unicode ;
Response.HeaderEncoding = Encoding.UTF8;

但这没有帮助。

有人有任何线索吗?

3 个答案:

答案 0 :(得分:16)

尝试使用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");
}

答案 1 :(得分:2)

使用ISO-8859-1而不是UTF-8

工作正常。

我在XLSX文档中尝试过。

答案 2 :(得分:2)

我尝试了很多编码,有效的编码是Windows-1252

Response.Clear();
Response.ContentType = "Application/x-msexcel";
Response.AddHeader("content-disposition", "attachment; filename=\"filename.csv\"");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Windows-1252");
Response.Write(string.Join(Environment.NewLine, myDataLines));
Response.End();