2015-04-15 4 views
7

Jeśli mam ciąg zawierający kombinację znaków diakrytycznych, wydaje się, że istnieje pewne nieporozumienie między zachowaniem się różnych funkcji ciągu znaków. Jeśli użyję String.IndexOf(), połączy on znak diakrytyczny i znajdzie właściwy znak. Jeśli użyję String.Split(), z jakiegoś powodu nie połączy się ich i nie znajdzie połączonego znaku.Różne zachowanie przy łączeniu znaków diakrytycznych między String.Split() i String.IndexOf()

Przykład Kod:

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

będzie działać prawidłowo, co oznacza, e nie występuje, ale E jest. Ale z jakiegoś powodu tego nie zachowuje się podobnie:

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

Z jakiegoś powodu Split() nie będzie łączyć diakrytykę i zostanie podzielony przez e, ale nie za pomocą poczty.

Czy istnieje jakiś powód tej funkcji i czy istnieje sposób, aby uzyskać funkcję IndexOf(), która nie łączy funkcji diakrytycznej, a najlepiej z funkcją Split()?

Edit: Zauważyłem, że wcześniej napisany błędny kod, miał „e”, a nie „e”

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

ten zachowuje się jak Split() również, więc nie ma między tymi metodami, to między przyjmowanie postaci lub napisu.

+0

Dodaj 'test = test.Normalize();' –

+0

@HansPassant Nie zawsze można normalizować dane, znaki diakrytyczne (lub inne informacje) mogą być pożądane, aby być oddzielone. W przeciwnym razie 'Normalize()' będzie drogą do zrobienia. Również nie jestem pewien, czy istnieje połączony znak dla każdego znaku diakrytycznego. –

+0

Musisz wymyślić lepszy przykład. Poważnie wątpię, że ją znajdziesz. –

Odpowiedz

1

Faktycznie, kiedy skopiuj i wklej przykładowy kod do pustego programu, mam dokładnie takie zachowanie mogę oczekiwać: zarówno IndexOf() i Split() nie traktują łączny charakter jak przeszedł w ë wyszukiwania charakteru. To znaczy. wywołanie do IndexOf('ë') zwraca -1 dla mnie, zgodnie z tym, jak opisujesz zachowanie Split().

Powiedział, że jeśli chcesz Split() traktować takie reprezentacje dwuznakowych z wersji single-znakowych, jak gdyby były one w rzeczywistości pierwotnie w wersji single-znakowy, można po prostu zadzwonić string.Normalize() przed Split(). Na przykład:

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

Sposób Normalize() ma przeciążenie do pozwalają kontrolować dokładny typ normalizacji, który powinien być wymagany (nie jest to w tym przykładzie masz na wyposażeniu).

+0

Właściwie mój kod był błędny, wydaje się! Zmienię. Miałem "e" w moim oryginalnym kodzie i na przykład tutaj napisałem "e" i zachowują się inaczej. –