[英]How to output Byte Order Mark when writing to TextWriter?
我正在向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
編寫編碼標記?
注意: UnicodeEncoding
的第二個參數:
context.Response.ContentEncoding = new UnicodeEncoding(true, true);
字節順序標記
類型:System.Boolean
true指定提供 Unicode 字節順序標記; 否則為false 。
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 字節順序標記是一些特殊的簽名。 我曾經認為我必須仔細決定我想輸出哪個字節序列,才能輸出正確的 BOM:
但從那以后我意識到字節 Byte-Order-Mark不是您必須添加到文件中的特殊字節序列。
BOM 只是一個Unicode 字符。 你不輸出任何字節; 你只輸出字符U+FEFF
。 寫一個字的非常行為,序列化將其轉換為任何你正在使用你的編碼。
選擇字符U+feff
( ZERO WIDTH NO-BREAK SPACE
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
轉換為它已配置使用的任何字節編碼。
注意:任何代碼都發布到公共領域。 不需要歸屬。
寫出 context.Response.ContentEncoding.GetPreamble()。 看看寫沒有字節順序標記(BOM)的文本文件?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.