2017-01-04 1 views
14

Ist es möglich, eine Zeichenfolge in Ordinal Groß- oder Kleinschreibung zu konvertieren. Ähnlich wie unveränderlich.Konvertieren einer Zeichenfolge in Ordinal Groß- oder Kleinschreibung

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

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

Wie ToUpperOrdinal und ToLowerOrdinal zu implementieren?

Bearbeiten: Wie erhält man die Ordinal-String-Darstellung? Wie erhält man die invariante Stringdarstellung? Vielleicht ist das nicht möglich, da es im obigen Fall mehrdeutig sein könnte, zumindest für die ordinale Darstellung.

Edit2:

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

aber

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

@diiN__________ Ich denke nicht, dass die Idee der Erweiterungsmethoden die Hilfe von OP benötigt. Sie wissen einfach nicht, wie der Code für eine solche Methode aussehen sollte. –

+0

Ich frage nicht nach Erweiterungsmethoden oder Stringcomparison. Nur wie man die ordinale String-Darstellung bekommt. – Wouter

+8

Es gibt keine ordinale Zeichenfolge _respresentation_, weil der ordinale Vergleich "jedes Byte vergleichen" bedeutet. –

Antwort

1

Von msdn:

TheStringComparer von der OrdinalIgnoreCase Eigenschaft zurückgegeben behandelt die Zeichen in den Zeichenfolgen zu vergleichen, als ob sie umgesetzt wurden Großbuchstaben unter Verwendung der Konventionen der invarianten Kultur und führt dann einen einfachen Byte-Vergleich durch Ison, das unabhängig von der Sprache ist.

Aber ich nehme an, das zu tun wird nicht erreichen, was Sie wollen, da einfach „ß“ .ToUpperInvariant tun() werden Sie keinen String geben, die ordinally equivallent ist zu „ss“. In der String.Equals-Methode, die den speziellen Fall Why “ss” equals 'ß' behandelt, muss etwas Magie vorhanden sein.

Wenn Sie nur über deutschen Text besorgt sind dann this answer might help.

+0

Nicht speziell Deutsch. Aber es ist nur ein Beispiel. – Wouter

1

Ich glaube nicht, dass diese Funktionalität in .NET Framework oder .NET Core vorhanden ist. Die nächste Sache ist string.Normalize(), aber es fehlt die Case-Fold-Option, die Sie erfolgreich abziehen müssen.

Diese Funktionalität existiert in der ICU project (die in C/Java verfügbar ist). Die Funktionalität, nach der Sie suchen, ist die unorm2.h-Datei in C oder die Normalizer2-Klasse in Java. Example usage in Java und related test.

Beachten Sie, dass versucht wird, die ICU-Funktionalität auf .NET zu portieren, indem Sie die C-Bibliothek in das Projekt icu.net einbetten. Gerade jetzt, there is no Normalizer2 class, aber ich denke nicht, dass es viel Mühe kosten würde, es zu implementieren.

+0

Thanx, für diese Addition, von dem, was ich rot auf msdn Normalize nicht ändert Groß-und Kleinbuchstaben nur normalisiert die vielen äquivalenten binären Darstellungen. Ich fand auch, dass Unicode 00df und 1e9e verwandt sind. Aber irgendwie ist 1e9e nicht der Großbuchstabe von 00df. Siehe: http://www.fileformat.info/info/unicode/char/00df/index.htm und http://www.fileformat.info/info/unicode/char/1e9e/index.htm. – Wouter

+0

Ja, deshalb habe ich erwähnt, dass es in meiner Antwort nicht ganz gleichwertig ist. Damit es so funktioniert, ist ein Aufruf auf der ICU unorm2.h erforderlich. Es wäre am besten, die API nach der Klasse Java Normalizer2 zu modellieren und sie in das icu.net-Projekt einzufügen, damit sie für jeden verfügbar ist. – NightOwl888

Verwandte Themen