如何在ASP.NET中的响应流中添加编码信息?

时间:2009-06-17 07:14:00

标签: asp.net encoding response response.write

我有以下代码:

public void ProcessRequest (HttpContext context) 
{
    context.Response.ContentType = "text/rtf; charset=UTF-8";
    context.Response.Charset = "UTF-8";
    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    context.Response.AddHeader("Content-disposition", "attachment;filename=lista_obecnosci.csv");
    context.Response.Write("ąęćżźń󳥌ŻŹĆŃŁÓĘ");
}

当我尝试打开生成的csv文件时,我得到以下行为:

  • 在Notepad2中 - 一切都很好。
  • 在Word中 - 转换向导打开并要求转换文本。它建议使用UTF-8,这是好的。
  • 在Excel中 - 我真的很乱。这些波兰人字符都不能显示。

我想在字符串前写下那些特殊的编码信息字符,即

context.Response.Write((char)0xef);
context.Response.Write((char)0xbb);
context.Response.Write((char)0xbf);

但这不会有任何好处。响应流将其视为普通数据并将其转换为不同的数据。

我很感激这方面的帮助。

4 个答案:

答案 0 :(得分:23)

您所谓的“编码信息”实际上是一个BOM。我怀疑每个“角色”都是分开编码的。要手动编写BOM,您必须将其写为三个字节,而不是三个字符。我不熟悉.NET I / O类,但是应该有一个方法可以使用byte或byte []参数并将它们直接写入文件。

顺便说一句,UTF-8 BOM是可选的;实际上,Unicode Consortium不鼓励使用它。如果您没有特定的使用理由,请节省一些麻烦并将其遗漏。

编辑:我记得你还可以写出实际的BOM 字符'\uFEFF',并让编码器处理它:

context.Response.Write('\uFEFF');

答案 1 :(得分:17)

我遇到了同样的问题,这是我的解决方案:

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźń󳥌ŻŹĆŃŁÓĘ");

答案 2 :(得分:2)

我认为问题出在基于Microsoft Excel mangles Diacritics in .csv files的Excel上。要证明这一点,请复制ąęćżźń󳥌ŻŹĆŃŁÓĘ的示例输出字符串并使用您喜欢的编辑器粘贴到测试文件中,并另存为UTF-8编码的.csv文件。在Excel中打开并查看相同的问题。

答案 3 :(得分:1)

来自Alan Moore的答案 翻译成VB:

Context.Response.Write(""c)