【问题标题】:(simple) CSV download with special characters drives me nuts(简单)带有特殊字符的 CSV 下载让我抓狂
【发布时间】:2010-12-07 08:33:11
【问题描述】:

这把我逼疯了。 上周我想我搞砸了,但不幸的是没有......

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

当我在记事本中打开它时:好的

当我在记事本++中打开它时:好的

当我在 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 时,一切顺利。

我在action方法中也试过这个:

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

但这并没有帮助。

有人知道吗?

【问题讨论】:

  • 您尝试了很多次的问题的不利方面是,它变成了一个为他人阅读的大故事,如果您花时间阅读所有内容并阅读此评论,请感谢您。 ...

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


【解决方案1】:

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

【讨论】:

  • 不幸的是,这没有成功。我已经尝试了你说的两种解决方案,从字面上看是那个代码,所以我删除了我的代码,这样就不会妨碍了。 Notepad、notepad++ 和 excel 就像代码一样,但是当我将文件保存到磁盘并用 Ms-Word (10) 打开时,它 (Word) 会询问文件的编码是什么......
  • @Michel,Word 在遇到非 ASCII 字符时总是这样做。尝试在 Excel 中保存包含这些特殊字符的 CSV 文件,然后在 Word 中打开它。它会询问您有关编码的信息。
  • 哇。我认为这很糟糕(可能会有一个很好的理由)。我也用记事本尝试过:创建新文件,粘贴这个“éåæÉà”,关闭并保存,用 Word 打开它,实际上,Word 会询问编码。客户说,当他们从记事本明确将其保存为 unicode 时,Word 会毫无疑问地打开它(他们将其用作邮件合并的来源)。当我从记事本将其保存为 unicode 并在 Word 中打开它(而不是 mailmerge)时,它确实要求编码。
  • 我一直收到错误消息“不可调用的成员'文件'不能用作方法”。有人知道为什么会这样吗?
  • 就我而言,这只是 Excel 中的 撇号问题。第一个解决方案对我来说很好!我还检查了它在 MS Word 中打开文件并按预期工作。
【解决方案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();

【讨论】:

  • 使用 Response.ContentEncoding = my-locale-encoding 对我有用
【解决方案3】:

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

它工作正常。

我在 XLSX 文档中尝试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2011-07-05
    • 2011-12-25
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多