private void AppendSurrogatePairNameChar (int ch)
{
- nameBuffer [nameLength++] = (char) (ch / 0x10000 + 0xD800 - 1);
+ nameBuffer [nameLength++] = (char) ((ch - 0x10000) / 0x400 + 0xD800);
if (nameLength == nameCapacity)
ExpandNameCapacity ();
- nameBuffer [nameLength++] = (char) (ch % 0x10000 + 0xDC00);
+ nameBuffer [nameLength++] = (char) ((ch - 0x10000) % 0x400 + 0xDC00);
}
private void ExpandNameCapacity ()
private void AppendSurrogatePairValueChar (int ch)
{
- valueBuffer.Append ((char) (ch / 0x10000 + 0xD800 - 1));
- valueBuffer.Append ((char) (ch % 0x10000 + 0xDC00));
+ valueBuffer.Append ((char) ((ch - 0x10000) / 0x400 + 0xD800));
+ valueBuffer.Append ((char) ((ch - 0x10000) % 0x400 + 0xDC00));
}
private string CreateValueString ()
if (ch < Char.MaxValue)
currentTagBuffer [currentTagLength++] = (char) ch;
else {
- currentTagBuffer [currentTagLength++] = (char) (ch / 0x10000 + 0xD800 - 1);
+ currentTagBuffer [currentTagLength++] = (char) ((ch - 0x10000) / 0x400 + 0xD800);
if (currentTagLength == currentTagCapacity)
ExpandCurrentTagCapacity ();
- currentTagBuffer [currentTagLength++] = (char) (ch % 0x10000 + 0xDC00);
+ currentTagBuffer [currentTagLength++] = (char) ((ch - 0x10000) % 0x400 + 0xDC00);
}
}
if (c < Char.MaxValue)
buffer [bufIndex++] = (char) c;
else {
- buffer [bufIndex++] = (char) (c / 0x10000 + 0xD800 - 1);
- buffer [bufIndex++] = (char) (c % 0x10000 + 0xDC00);
+ buffer [bufIndex++] = (char) ((c - 0x10000) / 0x400 + 0xD800);
+ buffer [bufIndex++] = (char) ((c - 0x10000) % 0x400 + 0xDC00);
}
break;
}
XmlNodeType.Document, null);
xtr.Read ();
}
+
+ [Test] // bug #76247
+ public void SurrogateRoundtrip ()
+ {
+ byte [] data = new byte [] {0x3c, 0x61, 0x3e, 0xf0,
+ 0xa8, 0xa7, 0x80, 0x3c, 0x2f, 0x61, 0x3e};
+ XmlTextReader xtr = new XmlTextReader (
+ new MemoryStream (data));
+ xtr.Read ();
+ string line = xtr.ReadString ();
+ int [] arr = new int [line.Length];
+ for (int i = 0; i < line.Length; i++)
+ arr [i] = (int) line [i];
+ AssertEquals (new int [] {0xd862, 0xddc0}, arr);
+ }
}
}