How to output Byte Order Mark when writing to TextWriter?
Short Version
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);
Long Version
At some point i realized how simple the solution is.
i used to think that the Unicode Byte-Order-Mark was some special signature. i used to think i had to carefully decide which byte sequence i wanted to output, in order to output the correct BOM:
- 0xFE 0xFF
- 0xFF 0xFE
- 0xEF 0xBB 0xBF
But since then i realized that byte Byte-Order-Mark is not some special byte sequence that you have to prepend to your file.
The BOM is just a Unicode character. You don't output any bytes; you only output character U+FEFF
. The very act of writing that character, the serializer will convert it to whatever encoding you're using for you.
The character U+feff
(ZERO WIDTH NO-BREAK SPACE
) was chosen for good reason. It's a space, so it has no meaning, and it is zero width, so you shouldn't even see it.
That means that my question is fundamentally flawed. There is no such thing as "writing a byte-order-mark". You just make sure the first character you write out is U+FEFF
. In my case i am writing to a TextWriter
:
void WriteStuffToTextWriter(TextWriter writer)
{
String csvExport = GetExportAsCSV();
writer.Write("\xfeff"); //Output unicode charcter U+FEFF as a byte order marker
writer.Write(csvExport);
}
The TextWriter
will handle converting the unicode character U+feff
into whatever byte encoding it has been configured to use.
Note: Any code is released into the public domain. No attribution required.