8

我正在向TextWriter. 我希望 UTF-16 字节顺序标记 ( BOM) 出现在输出中:

public void ProcessRequest(HttpContext context)
{
   context.Response.ContentEncoding = new UnicodeEncoding(true, true);
   WriteStuffToTextWriter(context.Response.Output);
}

除了输出不包含字节顺序标记:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 06 Sep 2012 21:09:23 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename="Transactions_Calendar_20120906.csv"
Cache-Control: private
Content-Type: text/csv; filename="Transactions_Calendar_20120906.csv"; charset=utf-16BE
Content-Length: 95022
Connection: Close

JobName,ShiftName,6////09////2012 12::::00::::00 АΜ,...

我如何告诉 aTextWriter编写编码标记?

注意第二个参数UnicodeEncoding

   context.Response.ContentEncoding = new UnicodeEncoding(true, true);

byteOrderMark
类型:true指定提供 Unicode 字节顺序标记;否则,falseSystem.Boolean

4

2 回答 2

13

简洁版本

String zwnbsp = "\xfeff"; //Zero-width non-breaking space

//The Zero-width non-breaking space character ***is*** the Byte-Order-Mark (BOM).
String s = zwnbsp+"The quick brown fox jumped over the lazy dog.";
writer.Write(s);

长版

在某些时候,我意识到解决方案是多么简单。

曾经认为 Unicode Byte-Order-Mark 是一些特殊的签名。我曾经认为我必须仔细决定要输出哪个字节序列,才能输出正确的 BOM:

  • 0xFE 0xFF
  • 0xFF 0xFE
  • 0xEF 0xBB 0xBF

但从那时起,我意识到字节 Byte-Order-Mark不是您必须添加到文件中的特殊字节序列。

BOM 只是一个Unicode 字符。您不输出任何字节;你只输出字符U+FEFF。编写该字符的行为本身,序列化程序会将其转换为您您使用的任何编码。

选择字符U+feff( ZERO WIDTH NO-BREAK SPACE) 是有充分理由的。它是一个空格,所以它没有任何意义,它是零宽度,所以你甚至不应该看到它。

这意味着我的问题从根本上是有缺陷的。没有“编写字节顺序标记”之类的东西。您只需确保您写出的第一个字符是U+FEFF. 就我而言,我正在写信给TextWriter

void WriteStuffToTextWriter(TextWriter writer)
{
   String csvExport = GetExportAsCSV();

   writer.Write("\xfeff"); //Output unicode charcter U+FEFF as a byte order marker
   writer.Write(csvExport);
}

TextWriter它将处理将 unicode 字符U+feff转换为已配置为使用的任何字节编码。

注意:任何代码都会发布到公共领域。无需归属。

于 2013-07-27T22:57:54.747 回答
0

写出 context.Response.ContentEncoding.GetPreamble()。看看写没有字节顺序标记(BOM)的文本文件?

于 2012-09-06T21:19:44.760 回答