2017-01-04 4 views
14

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

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 
+2

@diiN__________ Я не думаю, что идея методов расширения - это то, что OP нуждается в помощи. Они просто не знают, что такое код для такого метода. –

+0

Я не спрашиваю о методах расширения или сравнении строк. Только, как получить представление порядковой строки. – Wouter

+8

Нет порядковой строки _respresentation_, потому что порядковое сравнение означает «сравнивать каждый байт». –

ответ

1

От msdn:

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

Но я предполагаю, что делать, что не будет достичь того, чего вы хотите, так как просто делать «ß» .ToUpperInvariant() не даст вам строку, ординально для эквивалента «сс». В методе String.Equals должна быть какая-то магия, которая обрабатывает специальный случай Why “ss” equals 'ß'.

Если вас беспокоит только немецкий текст, то this answer might help.

+0

Не специально немецкий. Но это всего лишь пример. – Wouter

1

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

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

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

+0

Thanx, для этого добавления, от того, что я красный на msdn Normalize не меняется, верхний и нижний регистр только нормализуют множество эквивалентных двоичных представлений. Я также нашел, что unicode 00df и 1e9e связаны между собой. Но почему-то 1е9е не является прописным словом 00df. См. Http://www.fileformat.info/info/unicode/char/00df/index.htm и http://www.fileformat.info/info/unicode/char/1e9e/index.htm. – Wouter

+0

Да, именно поэтому я упомянул, что в моем ответе это не совсем верно. Чтобы это работало, нужно позвонить в ICU unorm2.h. Лучше всего смоделировать API после класса Java Normalizer2 и перенести его в проект icu.net, чтобы он был доступен для всех. – NightOwl888

Смежные вопросы