2013-02-22 12 views
24

così ho visto Jon Skeet video e ci fu un esempio di codice:Invertire una stringa con caratteri accentati?

Avrebbe dovuto esserci un problema con il é - dopo l'inversione, ma credo che non riesce a .NET2 (IMHO), in ogni caso ha fatto il lavoro per io e io abbiamo visto la stringa invertita corretta.

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

Ma ho preso ulteriormente:

In ebraico c'è il "Alef" char: א

e posso aggiungere la punteggiatura come: אֳ (che credo si compone di 2 caratteri - ancora visualizzato come uno)

Ma ora guarda cosa succede.

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

C'era una scissione ...

posso capire perché sta succedendo:

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

Così mi chiedevo se c'è una soluzione per questo tipo di problema in C# (o dovrei costruire il mio meccanismo ....)

+4

[TextElementEnumerator] (http: //msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.aspx) potrebbe essere utile qui. –

+0

Quindi 'א' sono due' caratteri '? – Jodrell

+0

Dovresti aggiungere questo come risposta Michael. Stavo solo scrivendo, non c'è niente di simile in .NET ... Bel lavoro. –

risposta

35

Il problema è che Array.Reverse non è a conoscenza del fatto che alcune sequenze di valori char possono combinarsi per formare un singolo carattere, o "grafema", e quindi non devono essere invertiti. Devi usare qualcosa che capisce Unicode che combina sequenze di caratteri, come 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 
+0

Giusto per chiarire, è 'ToCharArray()' che non è a conoscenza di queste sequenze, o è 'Array.Reverse()' dove inizia il problema? –

+0

@DerekHunziker: 'Array.Reverse' è il problema. –

8

Se hai fatto l'estensione

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

si potrebbe fare,

const string a = "AnyStringYouLike"; 
var aReversed = string.Concat(a.ToTextElements().Reverse()); 
Problemi correlati