8

にテキストを書いています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にエンコーディング マーカーを書き込むように指示するにはどうすればよいですか?

: の2 番目UnicodeEncodingのパラメーター:

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

byteOrderMark
タイプ: Unicode バイト オーダー マークが提供されることを指定する場合はtrue 。それ以外の場合はfalseSystem.Boolean

4

2 に答える 2

13

短縮版

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 Byte-Order-Mark は特別な署名だと思っていました正しい BOM を出力するには、出力するバイト シーケンスを慎重に決定する必要があると考えていました。

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

しかし、それ以来、バイト 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を、使用するように構成されているバイト エンコーディングに変換します。

: すべてのコードはパブリック ドメインにリリースされます。帰属は必要ありません。

于 2013-07-27T22:57:54.747 に答える
0

context.Response.ContentEncoding.GetPreamble() を書き出します。Write text files without Byte Order Mark (BOM)? をご覧ください

于 2012-09-06T21:19:44.760 に答える