我正在给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 АΜ,...
如何告诉TextWriter
编写编码标记?
注意:2nd paramter in UnicodeEncoding
:
context.Response.ContentEncoding = new UnicodeEncoding(true, true);
byteOrderMark
输入:System.Boolean
true 指定提供Unicode字节顺序标记;否则, false 。
答案 0 :(得分:9)
在某些时候,我意识到解决方案有多简单。
我使用认为Unicode Byte-Order-Mark是一些特殊的签名。我曾经认为我必须仔细决定我想输出哪个字节序列,以便输出正确的BOM:
但是从那以后我意识到字节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
转换为已配置使用的任何字节编码。
注意:任何代码都会发布到公共域中。无需归属。
答案 1 :(得分:0)
写出context.Response.ContentEncoding.GetPreamble()。看看Write text files without Byte Order Mark (BOM)?