2017-01-04 39 views
14

Czy można przekonwertować ciąg na liczbę porządkową lub małe litery. Podobnie jak niezmiennik.Konwertuj ciąg na porządkową wielką lub małą literę

string upperInvariant = "ß".ToUpperInvariant(); 
string lowerInvariant = "ß".ToLowerInvariant(); 
bool invariant = upperInvariant == lowerInvariant; // true 

string upperOrdinal = "ß".ToUpperOrdinal(); // SS 
string lowerOrdinal = "ß".ToLowerOrdinal(); // ss 
bool ordinal = upperOrdinal == lowerOrdinal; // false 

Jak wdrożyć ToUpperOrdinal i ToLowerOrdinal?

Edytuj: Jak uzyskać reprezentację ciągów porządkowych? Podobnie, jak uzyskać niezmienną reprezentację ciągów? Może to nie jest możliwe, ponieważ w powyższym przypadku może być niejednoznaczna, przynajmniej dla reprezentacji porządkowej.

Edit2:

string.Equals("ß", "ss", StringComparison.InvariantCultureIgnoreCase); // true 

ale

"ß".ToLowerInvariant() == "ss"; // false 
+2

@diiN__________ Nie sądzę, że pomysł metod rozszerzenia jest tym, co OP potrzebuje pomocy. Po prostu nie wiedzą, jaki powinien być kod takiej metody. –

+0

Nie pytam o metody rozszerzania ani porównywanie ciągów. Tylko jak uzyskać reprezentację ciągów porządkowych. – Wouter

+8

Nie ma ciągu porządkowego _reprezentacja_, ponieważ porównanie porządkowe oznacza "porównaj każdy bajt". –

Odpowiedz

1

Od msdn:

TheStringComparer zwracany przez właściwość OrdinalIgnoreCase traktuje znaki w struny, aby porównać, jak gdyby były one zamieniane na wielkie litery używające konwencji niezmienniczej kultury, a następnie wykonuje prosty bajt porównawczy ison, który jest niezależny od języka.

Ale zgaduję, że nie robi się osiągnąć to, co chcesz, ponieważ po prostu robi „ss” .ToUpperInvariant() nie daje znaków, który jest ordinally equivallent do „ss”. Musi być trochę magii w metodzie String.Equals, która obsługuje konkretny przypadek Why “ss” equals 'ß'.

Jeśli martwisz się tylko o tekst w języku niemieckim, to this answer might help.

+0

Nie specjalnie niemiecki. Ale to tylko przykład. – Wouter

1

Nie wierzę, że ta funkcjonalność istnieje w .NET Framework lub .NET Core. Najbliższą rzeczą jest string.Normalize(), ale brakuje w niej opcji fold case, którą trzeba z powodzeniem usunąć. Ta funkcja działa w ICU project (dostępna w języku C/Java). Funkcją, której szukasz, jest plik unorm2.h w języku C lub klasa Normalizer2 w języku Java. Example usage in Java i related test.

Należy zauważyć, że starano się przenieść funkcjonalność ICU do .NET, owijając bibliotekę C w projekcie icu.net. W tej chwili, there is no Normalizer2 class, ale nie wyobrażam sobie, że wdrożenie tego wymagałoby wiele wysiłku.

+0

Thanx, dla tego dodatku, z tego, co czerwone na msdn Normalizuje nie zmienia wielkich i małych tylko normalizuje wiele równoważnych reprezentacji binarnych. Odkryłem również, że Unicode 00df i 1e9e są ze sobą powiązane. Ale jakoś 1e9e nie jest wielką literą 00df. Zobacz: http://www.fileformat.info/info/unicode/char/00df/index.htm i http://www.fileformat.info/info/unicode/char/1e9e/index.htm. – Wouter

+0

Tak, właśnie dlatego wspomniałem, że nie jest do końca w mojej odpowiedzi. Aby to działało w ten sposób, potrzebne jest połączenie z ICU unorm2.h. Najlepiej będzie modelować API po klasie Java Normalizer2 i upuścić go do projektu icu.net, aby był dostępny dla wszystkich. – NightOwl888