26

所以我看到了 Jon 的 skeet视频,并且有一个代码示例:

- 反转后应该有问题,é 但我猜它在.net2(恕我直言)上失败,无论如何它确实对我有用,我确实看到了正确的反转字符串。

char[] a="Les Misérables".ToCharArray();
Array.Reverse(a);
string n= new string(a);
Console.WriteLine (n); //selbarésiM seL

但我更进一步:

在希伯来语中有“Alef”字符:א

我可以添加标点符号:(אֳ我相信它由 2 个字符组成 - 但显示为一个。)

但现在看看会发生什么:

char[] a="Les Misאֳrables".ToCharArray();
Array.Reverse(a);
string n= new string(a);
Console.WriteLine (n); //selbarֳאsiM seL

有一个分裂...

我能理解为什么会这样:

Console.WriteLine ("אֳ".Length); //2

所以我想知道在 C# 中是否有这种问题的解决方法(或者我应该建立自己的机制....)

4

2 回答 2

39

问题是Array.Reverse不知道某些char值序列可能组合形成单个字符或“字素”,因此不应该颠倒。您必须使用能够理解 Unicode 组合字符序列的东西,例如TextElementEnumerator

// using System.Globalization;

TextElementEnumerator enumerator =
    StringInfo.GetTextElementEnumerator("Les Misאֳrables");

List<string> elements = new List<string>();
while (enumerator.MoveNext())
    elements.Add(enumerator.GetTextElement());

elements.Reverse();
string reversed = string.Concat(elements);  // selbarאֳsiM seL
于 2013-02-22T17:05:13.190 回答
10

如果你做了扩展

public static IEnumerable<string> ToTextElements(this string source)
{
    var e = StringInfo.GetTextElementEnumerator(source)
    while (e.MoveNext())
    {
        yield return e.GetTextElement();
    }
}

你可以做,

const string a = "AnyStringYouLike";
var aReversed = string.Concat(a.ToTextElements().Reverse());
于 2013-02-22T17:19:30.483 回答