Skip to content

Instantly share code, notes, and snippets.

@CraftyFella
Created July 9, 2013 22:08
Show Gist options
  • Save CraftyFella/5961747 to your computer and use it in GitHub Desktop.
Save CraftyFella/5961747 to your computer and use it in GitHub Desktop.
Xml Encoding UTF8 and Hidden BOM Byte
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using FluentAssertions;
using NUnit.Framework;
namespace TestingUt8EncodingAndHiddenBOM
{
[TestFixture]
class Utf8BomTests
{
private const string ExpectedXml = @"<xml><node></node><thing></thing></xml>";
[Test]
public void ShouldWorkAsItWillUseDefaultEncoding()
{
const string outerXml = @"<xml><node></node>{0}</xml>";
const string innerXml = @"<thing></thing>";
var result = PrettyPrintXmlDefaultEncoding(string.Format(outerXml, PrettyPrintXmlDefaultEncoding(innerXml)));
result.Should().Be(PrettyPrintXmlDefaultEncoding(ExpectedXml));
}
[Test]
public void ShouldFailAsItWillAddTheBOMAtBeginningAndInMiddleOfFile()
{
const string outerXml = @"<xml><node></node>{0}</xml>";
const string innerXml = @"<thing></thing>";
var result = PrettyPrintXmlUtf8Busted(string.Format(outerXml, PrettyPrintXmlUtf8Busted(innerXml)));
FlattenXml(result).Should().Be(FlattenXml(PrettyPrintXmlUtf8Busted(ExpectedXml)));
}
[Test]
public void ShouldWorkAsNoBOMIsIncluded()
{
const string outerXml = @"<xml><node></node>{0}</xml>";
const string innerXml = @"<thing></thing>";
var result = PrettyPrintXmlUtf8Working(string.Format(outerXml, PrettyPrintXmlUtf8Working(innerXml)));
FlattenXml(result).Should().Be(FlattenXml(PrettyPrintXmlUtf8Working(ExpectedXml)));
}
private string FlattenXml(string input)
{
byte[] encodedString = Encoding.UTF8.GetBytes(input);
// Put the byte array into a stream and rewind it to the beginning
var ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;
// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
var xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
return xmlDoc.OuterXml;
}
private string PrettyPrintXmlDefaultEncoding(string input)
{
var doc = XDocument.Parse(input);
var xml = doc.ToString();
Console.WriteLine(xml);
return xml;
}
private string PrettyPrintXmlUtf8Working(string input)
{
var doc = XDocument.Parse(input);
var ms = new MemoryStream();
var encoding = new UTF8Encoding(false);
using (var writer = XmlWriter.Create(ms, new XmlWriterSettings
{
Indent = true,
Encoding = encoding,
OmitXmlDeclaration = true,
}))
{
doc.Save(writer);
}
return encoding.GetString(ms.ToArray());
}
private string PrettyPrintXmlUtf8Busted(string input)
{
var doc = XDocument.Parse(input);
var ms = new MemoryStream();
using (var writer = XmlWriter.Create(ms, new XmlWriterSettings
{
Indent = true,
Encoding = Encoding.UTF8,
OmitXmlDeclaration = true,
} ))
{
doc.Save(writer);
}
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment