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

Gre*_*reg 14 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("??????ó????????Ó?");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在Notepad2中 - 一切都很好.
  • 在Word中 - 转换向导打开并要求转换文本.它建议UTF-8,这在某种程度上是好的.
  • 在Excel中 - 我变得非常混乱.这些波兰语字符都不能显示.

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

context.Response.Write((char)0xef);
context.Response.Write((char)0xbb);
context.Response.Write((char)0xbf);
Run Code Online (Sandbox Code Playgroud)

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

我很感激这方面的帮助.

Ala*_*ore 23

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

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

编辑:我只记得你也可以编写实际的BOM 字符,'\uFEFF'以及让编码器处理:

context.Response.Write('\uFEFF');
Run Code Online (Sandbox Code Playgroud)


Col*_*n K 17

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

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("??????ó????????Ó?");
Run Code Online (Sandbox Code Playgroud)