private void EncodeCore(ref Writer writer, char *input, uint charsRemaining) { while (charsRemaining != 0) { int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) { // Supplementary characters should always be encoded numerically. WriteEncodedScalar(ref writer, (uint)nextScalar); // We consume two UTF-16 characters for a single supplementary character. input += 2; charsRemaining -= 2; } else { // Otherwise, this was a BMP character. input++; charsRemaining--; char c = (char)nextScalar; if (IsCharacterAllowed(c)) { writer.Write(c); } else { WriteEncodedScalar(ref writer, (uint)nextScalar); } } } }
private void GetScalarValueFromUtf16(string input, int expectedResult) { fixed(char *pInput = input) { Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); } }
//[Theory] //[InlineData(1, "a", (int)'a')] // normal BMP char, end of string //[InlineData(2, "ab", (int)'a')] // normal BMP char, not end of string //[InlineData(3, "\uDFFF", UnicodeReplacementChar)] // trailing surrogate, end of string //[InlineData(4, "\uDFFFx", UnicodeReplacementChar)] // trailing surrogate, not end of string //[InlineData(5, "\uD800", UnicodeReplacementChar)] // leading surrogate, end of string //[InlineData(6, "\uD800x", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by non-surrogate //[InlineData(7, "\uD800\uD800", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by leading surrogate //[InlineData(8, "\uD800\uDFFF", 0x103FF)] // leading surrogate, not end of string, followed by trailing surrogate //public private void GetScalarValueFromUtf16(int unused, string input, int expectedResult) { // The 'unused' parameter exists because the xunit runner can't distinguish // the individual malformed data test cases from each other without this // additional identifier. fixed(char *pInput = input) { Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); } }