What is BOM Character in C#
A BOM (Byte Order Mark) is a special Unicode character (U+FEFF) placed at the beginning of a text file to indicate the encoding format and byte order. In C#, you'll most commonly encounter BOM with UTF-8 and UTF-16 encoded files.
The BOM helps applications determine the encoding of a file. UTF-8 BOM is the three-byte sequence (0xEF, 0xBB, 0xBF). While optional for UTF-8, it can cause issues when not handled properly, especially with web files, JSON, or XML processing.
When reading files in C#, the StreamReader automatically detects and removes the BOM. However, when writing files or working with raw byte arrays, you need to explicitly handle the BOM based on your requirements.
using System;
using System.IO;
using System.Text;
// Detect if a file has BOM
string filePath = "sample.txt";
// Check for UTF-8 BOM
if (File.Exists(filePath))
{
byte[] buffer = new byte[3];
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
int bytesRead = fs.Read(buffer, 0, 3);
bool hasUtf8Bom = bytesRead == 3 && buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF;
Console.WriteLine($"File has UTF-8 BOM: {hasUtf8Bom}");
}
}
else
{
Console.WriteLine("File does not exist");
}
// Write file WITH BOM (UTF-8)
string contentWithBom = "This file has a BOM marker";
File.WriteAllText("with-bom.txt", contentWithBom, new UTF8Encoding(true)); // true = include BOM
Console.WriteLine("Created file with BOM");
// Write file WITHOUT BOM (UTF-8)
string contentWithoutBom = "This file has no BOM marker";
File.WriteAllText("without-bom.txt", contentWithoutBom, new UTF8Encoding(false)); // false = no BOM
Console.WriteLine("Created file without BOM");
// Read file and check for BOM using StreamReader
using (StreamReader reader = new StreamReader("with-bom.txt", true))
{
// StreamReader automatically detects and handles BOM
string content = reader.ReadToEnd();
Console.WriteLine($"\nContent from file with BOM: {content}");
Console.WriteLine($"Detected encoding: {reader.CurrentEncoding.EncodingName}");
}
// Remove BOM from string if present
string textWithBom = "\uFEFFHello World";
string textWithoutBom = textWithBom.TrimStart('\uFEFF');
Console.WriteLine($"\nOriginal length: {textWithBom.Length}");
Console.WriteLine($"After removing BOM: {textWithoutBom.Length}");
Console.WriteLine($"Text: {textWithoutBom}");
// Check if string starts with BOM
string possibleBomText = "\uFEFFTest";
bool startsWithBom = possibleBomText.StartsWith("\uFEFF");
Console.WriteLine($"\nString starts with BOM: {startsWithBom}");
// Create different encodings with BOM control
UTF8Encoding utf8WithBom = new UTF8Encoding(true);
UTF8Encoding utf8WithoutBom = new UTF8Encoding(false);
Console.WriteLine($"\nUTF-8 with BOM preamble length: {utf8WithBom.GetPreamble().Length}");
Console.WriteLine($"UTF-8 without BOM preamble length: {utf8WithoutBom.GetPreamble().Length}");
// Practical example: Reading JSON files that shouldn't have BOM
string jsonFilePath = "config.json";
string jsonData = "{\"name\":\"test\"}";
File.WriteAllText(jsonFilePath, jsonData, new UTF8Encoding(false));
// Safe reading approach
string jsonContent = File.ReadAllText(jsonFilePath);
jsonContent = jsonContent.TrimStart('\uFEFF'); // Remove BOM if present
Console.WriteLine($"\nJSON content: {jsonContent}");
// Compare file sizes with and without BOM
FileInfo fileWithBom = new FileInfo("with-bom.txt");
FileInfo fileWithoutBom = new FileInfo("without-bom.txt");
if (fileWithBom.Exists && fileWithoutBom.Exists)
{
Console.WriteLine($"\nFile with BOM size: {fileWithBom.Length} bytes");
Console.WriteLine($"File without BOM size: {fileWithoutBom.Length} bytes");
Console.WriteLine($"Difference: {fileWithBom.Length - fileWithoutBom.Length} bytes (BOM size)");
}Take It Further

The community's favorite C# guide — teaches every concept you just read about with clarity.
The C# Player's Guide — 5th Edition · RB Whitaker
Get it on Amazon →As an Amazon Associate I earn from qualifying purchases.