2012-09-06 15 views
6

tôi đang soạn văn bản cho một số TextWriter. tôi muốn UTF-16 Byte Order Mark (BOM) xuất hiện trong kết quả:Làm cách nào để xuất Đánh dấu đơn hàng Byte khi viết vào TextWriter?

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

Trừ đầu ra không chứa một dấu thứ tự byte:

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 АΜ,... 

Làm thế nào để tôi kể một TextWriter để viết mã đánh dấu?

Note: Các 2nd paramter in UnicodeEncoding:

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

byteOrderMark
Loại: System.Boolean
đúng để xác định rằng một Unicode thứ tự byte nhãn hiệu được cung cấp; nếu không, false.

+0

những gì chính xác là 'WriteStuffToTextWriter' bạn có thể có để xác định mã hóa có trong 'bạn StreamWriter' –

+1

Điều gì làm cho bạn nói rằng nó không chứa một BOM với mã bạn có? –

+0

Tôi đang ở với @JonHanna. Ngoài ra, bạn đã thử tạo một ứng dụng giao diện điều khiển và viết cùng một nội dung trực tiếp vào một tệp và xem nó trông như thế nào? Sau khi tất cả, một thứ * lof * xảy ra giữa máy chủ web và trình duyệt của bạn. – aquinas

Trả lời

7

Tại một thời điểm nào đó tôi đã nhận ra giải pháp đơn giản như thế nào.

i sử dụng để nghĩ rằng Byte-Order-Mark Unicode là một số chữ ký đặc biệt. tôi đã từng nghĩ tôi đã phải quyết định một cách cẩn thận mà chuỗi byte tôi muốn đầu ra, để sản lượng BOM đúng:

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

Nhưng kể từ đó tôi nhận ra rằng byte Byte-Order-Mark là không phải một số chuỗi byte đặc biệt mà bạn phải thêm vào tệp của mình.

HĐQT chỉ là Ký tự Unicode. Bạn không xuất ra bất kỳ byte nào; bạn chỉ xuất ra ký tự U+FEFF. Rất hành động của văn bản đó nhân vật, serializer sẽ chuyển đổi nó sang bất kỳ mã hóa bạn đang sử dụng cho bạn.

Ký tự U+feff (ZERO WIDTH NO-BREAK SPACE) đã được chọn vì lý do chính đáng. Đó là một không gian , do đó, nó không có ý nghĩa, và nó là không chiều rộng, vì vậy bạn thậm chí không nên nhìn thấy nó.

Điều đó có nghĩa là câu hỏi của tôi về cơ bản là thiếu sót. Không có nội dung nào như "viết một byte-trật tự-mark". Bạn chỉ cần đảm bảo ký tự đầu tiên bạn viết là U+FEFF.Trong trường hợp của tôi, tôi viết thư này để một TextWriter:

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

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

Các TextWriter sẽ xử lý chuyển đổi các ký tự unicode U+feff vào bất cứ mã hóa byte nó đã được cấu hình để sử dụng.

Lưu ý: Mọi mã được phát hành vào miền công cộng. Không yêu cầu ghi nhận tác giả.

0

Viết bối cảnh.Response.ContentEncoding.GetPreamble(). Hãy xem Write text files without Byte Order Mark (BOM)?

+0

Cẩn thận. Tôi không chắc chắn rằng họ không thực sự xuất một BOM rồi. Một U + FEFF thứ hai sẽ được hiểu là một khoảng trống không có độ rộng bằng 0 ở đầu văn bản thực, sau BOM. –

0

Tôi đã thử giải pháp của bạn nhưng giải pháp không hoạt động. Nó thực sự viết chuỗi \xfeff vào tệp đầu ra.

My Powershell mã như dưới đây:

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

Điều này dường như là một nhận xét cho bài đăng khác. Ngoài ra, mã của bạn là dành cho PowerShell trong khi câu hỏi là về C#. –

+0

Bạn sẽ phải tự tìm ra cách viết các ký tự unicode trong PowerShell. Dù là U + 0064 ('d'), U + 2020 (' † '), U + 277C (' ❼') hoặc U + FEFF (''). Trong một số ngôn ngữ lập trình, bạn chỉ ra chuỗi ký tự unicode thô là '" \ x277c "'. Trong ngôn ngữ yêu thích của tôi, nó là '# $ 277C'. Bạn sẽ phải tự mình tìm ra PowerShell. –

Các vấn đề liên quan