c# - 如何反转包含代理项对的字符串

标签 c# string reverse utf-16 surrogate-pairs

我写了这个方法来反转一个字符串

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

然后测试失败。是否有也支持代理对的密封实现?

如果我在上面犯了任何错误,请指出这一点,因为我不是 Unicode 专家。

最佳答案

\u10000 是两个字符的字符串:က (Unicode 代码点 1000)后跟 0(可以通过检查方法中 s 的值来检测)。如果您反转两个字符,它们将不再匹配输入。

您似乎在寻找 Unicode Character 'LINEAR B SYLLABLE B008 A' (U+10000)十六进制代码点 10000。来自 Unicode character escape sequences on MSDN :

\u hex-digit hex-digit hex-digit hex-digit

\U hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit

因此您必须使用四位或八位数字。

使用 \U00010000(注意大写 U)或 \uD800\uDC00 而不是 \u10000

关于c# - 如何反转包含代理项对的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22114707/

相关文章:

c# - 使 XSLT 语言独立

c# - 如何使用带有连接字符串的 MySQL EF 6

c# - LINQ Take()一遍又一遍地返回相同的结果

python - Pandas Python Groupby累计求和逆向

javascript - 如何在没有 Array.prototype.reverse 的情况下反转 JavaScript 中的数组?

python - python中print语句中第二个括号[]的含义

c# - 为什么它无法在构建为 dll 文件的 c++ 中全局声明一个类?

javascript - 如何在 JavaScript/jQuery 中查找数组是否包含特定字符串?

Java Scanner 类读取字符串

string - 如何在单个函数中接受&str、String 和&String?