代码之家  ›  专栏  ›  技术社区  ›  Michel

如何确保我创建的文件下载是UTF-8?(而不是没有BOM的UTF-8)

  •  8
  • Michel  · 技术社区  · 14 年前

    我做了一个下载功能,将消息下载到CSV文件(代码如下)。 现在,当我在记事本或记事本++中打开它时,我看到:

    纽约

    (这就是btw数据库中的内容)

    现在,当我在Ms Excel中打开它时,它显示如下:

    纽约

    当我用记事本++打开它时,它说它是用“UTF8无BOM”编码的。 当我将它(用记事本++)编码为UTF-8时,一切都很顺利(也就是说,Excel也显示了正确的字符)

    但我如何才能确保我从代码创建的文件是UTF-8呢?

    这是我的代码:

    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("");
    }
    

    编辑:

    我的函数现在返回 ByteArray 有了这个转变

    UTF8Encoding encoding = new UTF8Encoding();
    return encoding.GetBytes(str);
    

    我现在下载的是:

    Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
    return File(new DownloadService().GetPersonalMessages(), "text/csv");
    
    3 回复  |  直到 14 年前
        1
  •  4
  •   Zareth    14 年前

    您可能想尝试使用 UTF8Encoding 上课。构造函数具有一个参数,该参数确定是否应提供BOM。您可能需要使用GetBytes方法并将字符串作为响应中的一系列字节写入,而不是将其转换回.net字符串对象。

        2
  •  21
  •   Community Dan Abramov    7 年前

    扎雷斯的回答帮助了这次行动,但实际上并没有回答这个问题。以下是正确的解决方案 this other post :

    public ActionResult Download()
    {
        var data = Encoding.UTF8.GetBytes("some data");
        var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
        return File(result, "application/csv", "foo.csv");
    }
    

    字节顺序标记(虽然在技术上不需要UTF8)提示某些程序(例如Excel>2007)您正在使用UTF8。您必须通过 GetPreamble() 方法。

        3
  •  1
  •   Darin Dimitrov    14 年前

    您可以简化一下代码:

    public ActionResult DownloadPersonalMessages()
    {
        StringBuilder myCsv = new StringBuilder();
        myCsv.Append(new DownloadService().GetPersonalMessages());
        Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
        return File(Encoding.UTF8.GetBytes(myCsv.ToString()), "text/csv");
    }
    

    就UTF-8编码而言,恐怕问题在于 GetPersonalMessages 方法。您可能需要返回一个流或字节数组,可以直接将其作为文件返回。