我写了这个方法来反转一个字符串
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/