ASP.NET在CSV Excel中出现奇怪字符问题

5

我正在将一张数据表导出为CSV格式,例如:

    "COL1","COL2","COL3"
    "1","some text", "£232.00"
    "2","some more text", "£111.00"
    "3","other text", "£2.00"

使用ashx处理程序导出代码非常简单:

    context.Response.Clear()
    context.Response.ContentType = "text/csv"
    context.Response.AddHeader("Content-disposition", "attachment;filename=data.csv")
    context.Response.AddHeader("Cache-Control", "must-revalidate")
    context.Response.AddHeader("Pragma", "must-revalidate")
    context.Response.Write(data)
    context.Response.Flush()
    context.Response.End()

我的问题是当Excel尝试打开导出的文件时,所有£符号前面都会出现字符Â,例如,数值应该是£232.00,但显示为£232.00


1
这看起来像是Unicode到UTF-8转换错误。我不知道如何立即修复它。 - Yes - that Jake.
2个回答

7

您需要设置编码,即Response.ContentEncoding属性。

在最终在Reflector中查找后,如果存在system.web/globalization配置部分,则默认的ContentEncoding可能是Encoding.DefaultEncoding.UTF8,除非在该配置部分中覆盖了responseEncoding属性。

至于是否将ContentEncoding属性设置为执行与否有所不同:

  • 如果将其设置为与当前设置相同的对象,则会明确捕获并什么也不做;
  • 但是,如果更改设置,则会调用HttpWriter.UpdateResponseEncoding,该方法在切换到新编码之前调用HttpWriter.FlushCharBuffer,如果已经缓冲要写入的任何内容。
  • 如果不设置ContentEncoding,则通过对HttpWriter.UpdateResponseEncoding的第一次引用将其设置为我上面提到的默认值,因为在编写方法中检查HttpWriter._responseEncodingUpdated并且仅在HttpWriter.UpdateResponseEncoding结束时更新为True

因此,我认为OP需要将编码更改为Unicode,我假设Phil Hale的评论意味着他有一个需要覆盖的system.web/globalization配置部分。

注:

  • 现有代码调用Response.Clear仅影响内容,而不是标头,因此与我之前的建议相反,我认为它不相关,除了删除任何可能存在的现有内容在ContentEncoding更改之前被刷新的机会。
  • 这是基于.NET Framework 2.0中的System.Web的Reflector 6输出。

1
谢谢您的建议,问题已解决。"context.Response.ContentEncoding = System.Text.Encoding.Unicode" - user23048345
3
我通过添加 Response.ContentEncoding = Encoding.Default; 来解决了这个问题。说实话,我不太确定为什么这样能行。 - Phil Hale

0

这个对我有用 - 其他的不行

Response.ContentEncoding = System.Text.Encoding.Default

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接