Мы создали модульный тест, который использует следующие методы для генерации случайного текста UTF8:
private static Random _rand = new Random(Environment.TickCount);
public static byte CreateByte()
{
return (byte)_rand.Next(byte.MinValue, byte.MaxValue + 1);
}
public static byte[] CreateByteArray(int length)
{
return Repeat(CreateByte, length).ToArray();
}
public static string CreateUtf8String(int length)
{
return Encoding.UTF8.GetString(CreateByteArray(length));
}
private static IEnumerable<T> Repeat<T>(Func<T> func, int count)
{
for (int i = 0; i < count; i++)
{
yield return func();
}
}
При отправке случайных строк UTF8 в нашу бизнес-логику XmlWriter записывает сгенерированную строку и может завершиться с ошибкой:
Test method UnitTest.Utf8 threw exception:
System.ArgumentException: ' ', hexadecimal value 0x0E, is an invalid character.
System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
System.Xml.XmlUtf8RawTextWriterIndent.WriteString(String text)
System.Xml.XmlWellFormedWriter.WriteString(String text)
System.Xml.XmlWriter.WriteAttributeString(String localName, String value)
Мы хотим поддерживать любую возможную строку, которую нужно передать, и хотим, чтобы эти недопустимые символы каким-либо образом экранировались.
XmlWriter уже экранирует такие вещи, как &, <,> и т. Д.,как мы можем иметь дело с другими недопустимыми символами, такими как управляющие символы и т. д.?
PS - дайте мне знать, если наш генератор UTF8 имеет недостатки (я уже вижу, где я не должен позволять ему генерировать '\ 0'))