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

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

应该有一个问题é – 在倒车之后但是我猜它在.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#中是否存在针对此类问题的解决方法(或者我应该构建自己的机制……)

问题是Array.Reverse不知道某些char值序列可能组合形成一个单独的字符,或“grapheme”,因此不应该反转。 您必须使用能够理解Unicode组合字符序列的内容,例如TextElementEnumerator :

 // using System.Globalization; TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator("Les Misאֳrables"); List elements = new List(); while (enumerator.MoveNext()) elements.Add(enumerator.GetTextElement()); elements.Reverse(); string reversed = string.Concat(elements); // selbarאֳsiM seL 

如果你做了扩展

 public static IEnumerable 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());