2015-04-15 4 views
7

Wenn ich eine Zeichenfolge habe, die diakritische Zeichen enthält, scheint etwas Verwirrung zwischen dem Verhalten zwischen verschiedenen Zeichenfolgenfunktionen zu bestehen. Wenn ich String.IndexOf() verwende, wird es das diakritische kombinieren und das richtige Zeichen finden. Wenn ich String.Split() verwende, wird es aus irgendeinem Grund nicht kombinieren und das kombinierte Zeichen nicht finden.Unterschiedliches Verhalten beim Kombinieren von diakritischen Zeichenfolgen zwischen String.Split() und String.IndexOf()

Beispielcode:

string test = "abce\u0308fgh"; 
Console.WriteLine(test.IndexOf("e")); 
Console.WriteLine(test.IndexOf("ë")); 

Dies wird wie erwartet, wird die E Sinn nicht gefunden, aber die ë ist. Aber aus irgendeinem Grund, dies verhält sich nicht ähnlich:

string test = "abcde\u0308fgh"; 
Console.WriteLine(test.Split('e').Length.ToString()); 
Console.WriteLine(test.Split('ë').Length.ToString()); 

Aus irgendeinem Grund Split() nicht die diakritischen kombinieren und per E geteilt wird, aber nicht durch ë.

Gibt es einen Grund für diese Funktionalität und ist es eine Möglichkeit, entweder eine IndexOf() Funktion haben, die nicht die diakritischen nicht kombinieren, oder vorzugsweise eine Split() Funktion, das tut?

Edit: Bemerkt ich früher falsche Code geschrieben hatte, hatte es ‚e‘ und nicht „e“

string test = "abce\u0308fgh"; 
Console.WriteLine(test.IndexOf('e')); 
Console.WriteLine(test.IndexOf('ë')); 

Dieses auch als Split() verhält, so ist es nicht zwischen den Methoden, ist es zwischen ein Zeichen oder eine Zeichenkette nehmen.

+0

Hinzufügen 'test = test.Normalize();' –

+0

@HansPassant Nicht immer können die Daten normalisiert werden, die diakritischen Zeichen (oder andere Informationen) können wünschenswert sein, getrennt zu bleiben. Andernfalls wäre 'Normalize()' der richtige Weg. Ich bin mir auch nicht sicher, ob es für jedes Diakritikum ein kombiniertes Zeichen gibt. –

+0

Sie müssen ein besseres Beispiel finden. Ich bezweifle ernsthaft, dass du einen finden wirst. –

Antwort

1

Eigentlich, wenn ich Ihren Beispielcode in ein leeres Programm kopieren und einfügen, erhalte ich genau das Verhalten, das ich erwarten könnte: sowohl IndexOf() und Split() nicht den kombinierten Charakter als in ë Suchzeichen übergeben behandeln. I.e. Der Aufruf an IndexOf('ë') gibt -1 für mich zurück, konsistent mit, wie Sie das Verhalten von Split() beschreiben.

Das heißt, wenn Sie Split() wollen solche zweistelligen Darstellungen von Einzelzeichen Versionen zu behandeln, als ob sie in der Tat ursprünglich die Einzelzeichen Version waren, können Sie string.Normalize() nennen kurz vor Split(). Zum Beispiel:

Console.WriteLine(test.Normalize().Split('ë').Length); 

Die Normalize() Methode hat eine Überlastung Sie die genaue Art der Normalisierung kontrollieren zu lassen, sollte das notwendig sein (es ist nicht in dem Beispiel, das Sie zur Verfügung gestellt haben).

+0

Eigentlich war mein Code falsch, es scheint! Ich werde ändern. Ich hatte "e" in meinem ursprünglichen Code und für das Beispiel hier schrieb ich "e" und sie benehmen sich anders. –

Verwandte Themen