c# - 写入TextWriter时如何输出字节顺序标记?

标签 c# encoding utf-8 utf-16 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 写入编码标记?

注意:2nd paramter in UnicodeEncoding :

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

byteOrderMark
Type: System.Boolean
true to specify that a Unicode byte order mark is provided; otherwise, 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 Byte-Order-Mark 是一些特殊的签名。我曾经认为我必须仔细决定我想要输出哪个字节序列,以便输出正确的 BOM:

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

但从那时起我意识到 byte Byte-Order-Mark 不是您必须添加到文件中的一些特殊字节序列。

BOM 只是一个 Unicode 字符。您不输出任何字节;你只输出字符U+FEFF。编写该字符的行为,序列化器会将其转换为您您使用的任何编码。

选择字符 U+feff(零宽度不间断空格)是有充分理由的。它是一个空格,所以它没有任何意义,而且它是零宽度,所以你甚至不应该看到它。

这意味着我的问题存在根本性缺陷。不存在“编写字节顺序标记” 这样的事情。您只需确保您写出的第一个字符是 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 转换为已配置为使用的任何字节编码。

Note: Any code is released into the public domain. No attribution required.

关于c# - 写入TextWriter时如何输出字节顺序标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12308509/

相关文章:

android - Nv21字节数据在android中保存为彩色H264格式

java - 将任何字符串转换为 UTF-8 格式

c# - 如何删除某些文本中而不是某些文本开头存在的任何 UTF-8 BOM

asp.net-mvc - 如何在 C# 中使用带有 BOM 的 UTF8 编码 GetBytes()?

c# - 表单 DataGridView 缺少 OnRowDataBound?

c# - 嵌套 LINQ 方法抛出 `Not Supported...` 异常

c# - Expression.Convert 不会为不变值类型参数抛出 InvalidOperationException?

c# - c++/c# 系统和程序资源监控 - Windows

python - 致命的 Python 错误 : Py_Initialize: unable to load the file system codec. 导入错误:没有名为 'encodings' 的模块

java - 为什么我的 Servlet 不响应 UTF-8 格式的 JSON 请求?