void WriteCharacterEntity (char ch, char high, bool surrogate)
{
if (surrogate &&
('\uD800' > high || high > '\uDC00' ||
'\uDC00' > ch || ch > '\uDFFF'))
throw ArgumentError (String.Format ("Invalid surrogate pair was found. Low: &#x{0:X}; High: &#x{0:X};", (int) ch, (int) high));
else if (check_character_validity && XmlChar.IsInvalid (ch))
throw ArgumentError (String.Format ("Invalid character &#x{0:X};", (int) ch));
ShiftStateContent ("Character", true);
int v = surrogate ? (high - 0xD800) * 0x400 + ch - 0xDC00 + 0x10000 : (int) ch;
writer.Write ("&#x");
writer.Write (v.ToString ("X", CultureInfo.InvariantCulture));
writer.Write (';');
}