Как перевернуть строку, содержащую суррогатные пары

Я написал этот метод, чтобы перевернуть строку

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"));

тогда тест не пройден. Существует ли герметичная реализация, которая также поддерживает суррогатные пары?

Если я допустил какую-либо ошибку выше, пожалуйста, укажите это, поскольку я не эксперт по Юникоду.

Ответы на вопрос(4)

Ваш ответ на вопрос