26

だから私はジョンのスキートビデオを見ました、そしてコードサンプルがありました:

-を逆にした後、問題が発生したはずé ですが、.net2(IMHO)では失敗すると思いますが、とにかくうまくいき、正しい逆の文字列が表示されました。

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

しかし、私はそれをさらに進めました:

ヘブライ語には「Alef」文字があります:א

そして、次のような句読点を追加できます:(אֳこれは2文字で構成されていると思いますが、1文字として表示されます)。

しかし、今何が起こるか見てください:

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が組み合わされて単一の文字、つまり「書記素」を形成する可能性があることを認識していないため、逆にしないでください。TextElementEnumeratorのように、Unicodeの結合文字シーケンスを理解するものを使用する必要があります。

// 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 に答える