簡體   English   中英

寫入TextWriter時如何輸出字節順序標記?

[英]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:

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

但從那以后我意識到字節 Byte-Order-Mark不是您必須添加到文件中的特殊字節序列。

BOM 只是一個Unicode 字符 你不輸出任何字節; 你只輸出字符U+FEFF 寫一個字的非常行為,序列化將其轉換為任何你正在使用的編碼。

選擇字符U+feffZERO 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM