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.

4

2 回答 2

7

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

最后在 Reflector 中查找后,如果存在配置部分,则默认ContentEncoding值可能是Encoding.Defaultor ,除非它被该配置部分中的属性覆盖。Encoding.UTF8system.web/globalizationresponseEncoding

至于设置ContentEncoding属性是否与不这样做不同:

  • 如果您将其设置为与其当前设置相同的对象,它会明确地捕捉到它并且什么也不做;
  • 但是,如果您更改设置,它会调用HttpWriter.UpdateResponseEncodingHttpWriter.FlushCharBuffer如果已经缓冲了要写入的任何内容,则会在切换到新编码之前调用。
  • 如果你不设置ContentEncoding它被设置为我上面提到的默认值,首先引用HttpWriter.UpdateResponseEncoding,在任何内容写入之前肯定会调用它,因为HttpWriter._responseEncodingUpdated在写入方法中检查并且只True在末尾更新HttpWriter.UpdateResponseEncoding

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

笔记:

  • 现有的代码调用Response.Clear只影响内容,而不是标题,因此,与我之前的建议相反,我认为它相关,除了在更改之前消除现有内容的任何机会被刷新ContentEncoding
  • 这是基于System.Web来自 .NET Framework 2.0 的 Reflector 6 输出。
于 2010-03-16T08:45:48.307 回答
0

这对我有用 - 其他人没有

Response.ContentEncoding = System.Text.Encoding.Default
于 2016-09-14T11:12:52.180 回答