17

我有以下代码:

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 文件时,我得到以下行为:

  • 在记事本2 - 一切都很好。
  • 在 Word - 转换向导打开并要求转换文本。它建议使用 UTF-8,这在某种程度上是可以的。
  • 在 Excel 中 - 我真的一团糟。无法显示这些波兰语字符。

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

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

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

我很感激这方面的帮助。

4

4 回答 4

25

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

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźń󳥌ŻŹĆŃŁÓĘ");
于 2012-09-18T20:00:40.727 回答
24

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

顺便说一句,UTF-8 BOM 是可选的;事实上,Unicode 联盟不鼓励使用它。如果您没有使用它的特定原因,请省去一些麻烦并将其排除在外。

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

context.Response.Write('\uFEFF');
于 2009-06-17T23:26:07.520 回答
2

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

于 2009-06-18T01:51:20.737 回答
1

Alan Moore的答案 翻译成 VB:

Context.Response.Write(""c)
于 2012-04-17T13:22:24.580 回答