【问题标题】:Reverse a string with accent chars?用重音字符反转字符串?
【发布时间】:2013-02-08 08:52:02
【问题描述】:

所以我看到了 Jon 的 skeet 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# 中是否有解决此类问题的方法(或者我应该建立自己的机制......)

【问题讨论】:

  • TextElementEnumerator 在这里可能有用。
  • 所以א 是两个chars?
  • 你应该添加这个作为答案迈克尔。只是在写 .NET 中没有这样的东西......干得好。
  • @Jodrell,实际上,如果你在 Visual Studio 编辑器中粘贴 Misאֳrables,将光标设置在 אֳ 字符的左侧,然后按右键,你会看到它直接转到 a,而不是河它也有向左移动的问题(在一次按键期间保持阻塞)......
  • 关于 Misérables 的事情:对于重音字母(例如法语 é),可能有两种或多种方式将它们编码为 Unicode。作为 one 单个代码点,它包含整个重音字母,或者作为简单的 e 后跟一个或多个非间距“组合”重音字符。因此,如果您想获得“有问题的”Les Misérables 字符串,请以string m1 = "Les Misérables".Normalize(NormalizationForm.FormD); 或string m2 = "Les Mise\u0301rables"; 开头。在反转之前,重音在e 上方。不小心倒车后,重音越过了r,也就是ŕ。

标签: c# .net unicode .net-4.0


【解决方案1】:

问题在于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

【讨论】:

  • 澄清一下,是ToCharArray() 不知道这些序列,还是Array.Reverse() 是问题开始的地方?
  • @DerekHunziker: Array.Reverse 是问题所在。
  • 我会说问题是Char的定义。
【解决方案2】:

如果你做了扩展

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2017-06-21
    • 2011-09-27
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多