2012-09-06 58 views
6

我正在將文本寫入TextWriter。我想UTF-16字節順序標記(BOM)出現在輸出:如何在寫入TextWriter時輸出字節順序標記?

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
真正指定Unicode字節順序標記設置;否則,虛假

+0

到底是什麼'WriteStuffToTextWriter'你可能必須有指定你的'StreamWriter' –

+1

編碼你說的是什麼使得它不包含一個BOM你有的代碼? –

+0

我與@JonHanna。另外,你是否嘗試過創建一個控制檯應用程序,並將相同的東西直接寫入文件並查看它的外觀?畢竟,在你的網絡服務器和你的瀏覽器之間會發生一些lof * stuff *。 – aquinas

回答

7

在某個時候,我意識到解決方案有多簡單。

i 使用認爲Unicode字節順序標記是一些特殊的簽名。我曾經以爲我不得不小心翼翼決定我想以輸出字節序列,才能輸出正確的BOM:

  • 0xFE的0xFF的
  • 爲0xFF 0xFE的
  • 0xEF爲0xBB 0xBF時才

但是從那以後,我意識到字節Byte-Order-Mark是而不是一些特殊的字節序列,你必須在你的文件中加上前綴。

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

字符U+feffZERO 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轉換成任何字節編碼,它已被配置爲使用。

注意:任何代碼發佈到公共領域。無需歸屬。

0

寫出context.Response.ContentEncoding.GetPreamble()。看看Write text files without Byte Order Mark (BOM)?

+0

雖然小心點。我不確定他們是不是已經實際輸出物料清單。在BOM之後,第二個U + FEFF將被解釋爲實際文本開始處的零寬度不間斷空間。 –

0

我試過你的解決方案,但它不起作用。它實際上將字符串\xfeff寫入輸出文件。

我的PowerShell代碼是如下:

System.Text.StringBuilder] $stringBuilder = New-Object System.Text.StringBuilder; 
$utf16 = new-object System.Text.UnicodeEncoding; 
[System.IO.StreamWriter] $writer = New-Object System.IO.StreamWriter("C:\dev\BPM_To_BV\BOM_Test.xml",$utf16); 
    $stringBuilder.AppendLine("\uFEFF"); 
    $stringBuilder.AppendLine("<Root>"); 
    $stringBuilder.AppendLine("</Root>"); 
    $xml = $stringBuilder.ToString(); 
    $writer.Write($xml); 
    $writer.Flush(); 
    $writer.Close(); 
+0

這似乎是對其他帖子的評論。另外,你的代碼是用於PowerShell,而問題是關於C#。 –

+0

你必須弄清楚如何在PowerShell中編寫unicode字符。是否是U + 0064('d'),U + 2020('†'),U + 277C('❼')還是U + FEFF('')。在某些編程語言中,你指定一個原始的unicode字符序列爲'「\ x277c」'。用我最喜歡的語言是'#$ 277C'。你必須爲自己弄清楚PowerShell。 –