Преобразование строки в порядковый верхний или нижний регистр
Можно ли преобразовать строку в порядковый верхний или нижний регистр. Подобно инварианту.
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, но я не думаю, что для его реализации потребовалось бы много усилий.