Преобразование строки в порядковый верхний или нижний регистр

Можно ли преобразовать строку в порядковый верхний или нижний регистр. Подобно инварианту.

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

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

Как реализовать ToUpperOrdinal и ToLowerOrdinal?

Изменить: Как получить представление порядковой строки? Аналогично, как получить инвариантное представление строки? Может быть, это невозможно, как в приведенном выше случае, это может быть неоднозначно, по крайней мере для порядкового представления.

Edit2:

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

но

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

Ответы

Ответ 1

От msdn:

TheStringComparer, возвращаемый свойством OrdinalIgnoreCase, обрабатывает символы в строках для сравнения, как если бы они были преобразованы в верхний регистр с использованием условностей инвариантной культуры, а затем выполняет простое сравнение байтов, которое не зависит от языка.

Но я предполагаю, что это не будет делать то, что вы хотите, поскольку просто делать "ß".ToUpperInvariant() не даст вам строку, которая равнозначна "ss". В методе String.Equals должна быть какая-то магия, которая обрабатывает специальный случай Почему "ss" равно "ß" .

Если вас беспокоит только немецкий текст, этот ответ может помочь.

Ответ 2

Я не верю, что эта функциональность существует в .NET Framework или .NET Core. Самое близкое - string.Normalize(), но в нем отсутствует опция фальцовки, которую нужно успешно удалить.

Эта функциональность существует в проекте ICU (который доступен на C/Java). Функцией, которой вы пользуетесь, является unorm2.h файл в C или Normalizer2 в Java. Пример использования в Java и связанный тест.

Обратите внимание, что есть попытка отключить функциональность ICU до .NET путем упаковки библиотеки C в проект icu.net. Прямо сейчас нет класса Normalizer2, но я не думаю, что для его реализации потребовалось бы много усилий.