c# - (简单)带有特殊字符的 CSV 下载让我抓狂

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

这个让我抓狂。 上周我以为我破解了坚果,但不幸的是没有......

所以我想创建一个 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”包含(除其他信息外)这些字符:é å æ É à

当我用记事本打开它时:OK

当我在 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/

相关文章:

c# - 在构造函数中向RichTextBox添加文本

c# - 将文件夹名称与 Productivity Power Tools 颜色编码相匹配的正则表达式

asp.net-mvc - ASP.NET MVC - 如何获取操作的完整路径

Python base64.decode 似乎不适用于 Windows

string - 这是什么编码/压缩算法?

c# - 从分组元素中选择多个

c# - List<T>.ForEach() 使用 Async 有什么意义吗?

c# - 无法使 MvcMiniProfiler 与 EF4.1 和我们的存储库模式一起使用

c# - 如何使用 HttpWebRequest 将数据发布到 MVC Controller ?

java - XML 转换失败