Как перевернуть строку, содержащую суррогатные пары
Я написал этот метод, чтобы перевернуть строку
public string Reverse(string s)
{
if(string.IsNullOrEmpty(s))
return s;
TextElementEnumerator enumerator =
StringInfo.GetTextElementEnumerator(s);
var elements = new List<char>();
while (enumerator.MoveNext())
{
var cs = enumerator.GetTextElement().ToCharArray();
if (cs.Length > 1)
{
elements.AddRange(cs.Reverse());
}
else
{
elements.AddRange(cs);
}
}
elements.Reverse();
return string.Concat(elements);
}
Теперь я не хочу начинать дискуссию о том, как сделать этот код более эффективным или как можно использовать один из них. Я знаю, что вы можете выполнять Xors и все другие, чтобы потенциально улучшить этот код. Если я захочу провести рефакторинг кода позже, я могу сделать это легко, поскольку у меня есть модульные тесты.
В настоящее время это правильно переворачивает строки BML (включая строки с акцентами, такими как"Les Misérables"
) и строки, содержащие комбинированные символы, такие как"Les Mise\u0301rables"
.
Мой тест, содержащий суррогатные пары, работает, если они выражены так
Assert.AreEqual("", _stringOperations.Reverse(""));
Но если я выражу суррогатные пары, как это
Assert.AreEqual("\u10000", _stringOperations.Reverse("\u10000"));
тогда тест не пройден. Существует ли герметичная реализация, которая также поддерживает суррогатные пары?
Если я допустил какую-либо ошибку выше, пожалуйста, укажите это, поскольку я не эксперт по Юникоду.