用重音字符反转一个字符串?

Roy*_*mir 25 .net c# unicode .net-4.0

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

应该有一个问题é - 在倒车之后但是我猜它在.net2(恕我直言)上失败了,无论如何它确实对我有效并且我确实看到了正确的反转字符串.

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

但我进一步说:

在希伯来语中有"Alef"字符: ?

我可以添加标点符号:( ??我相信它包含2个字符 - 但显示为一个.)

但现在看看会发生什么:

char[] a="Les Mis??rables".ToCharArray();
Array.Reverse(a);
string n= new string(a);
Console.WriteLine (n); //selbar??siM seL
Run Code Online (Sandbox Code Playgroud)

分裂......

我能理解为什么会这样:

Console.WriteLine ("??".Length); //2
Run Code Online (Sandbox Code Playgroud)

所以我想知道在C#中是否存在针对此类问题的解决方法(或者我应该构建自己的机制......)

Mic*_*Liu 37

问题在于,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
Run Code Online (Sandbox Code Playgroud)

  • 我会说问题是`Char`的定义. (2认同)

Jod*_*ell 10

如果你做了扩展

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

你能做到的,

const string a = "AnyStringYouLike";
var aReversed = string.Concat(a.ToTextElements().Reverse());
Run Code Online (Sandbox Code Playgroud)