Что касается аспекта кодирования, посмотрите на String.Normalize
.Обратите внимание также на его перегрузку, которая задает конкретную нормальную форму , в которую вы хотите преобразовать строку, но нормальная форма по умолчанию (C) будет отлично работать почти для всех, кто хочет " отобразить все этиразличные символы в их самой стандартной форме".
Однако, все становится более сложным, когда вы перемещаетесь в базу данных и сталкиваетесь с сопоставлениями.
Нормализация Unicode никогда не меняет регистр символов,Он охватывает только случаи, когда символы в основном эквивалентны - выглядят одинаково 1 , означают одно и то же.Например,
Χιοσ != Χίος,
Два сигма-символа считаются неэквивалентными , а акцентированная йота (\u1F30
) эквивалентна последовательности из двух символов, простой йоты (\u03B9
) и ударение (\u0313
).
Похоже, ваша настоящая проблема в том, что вы используете строки Unicode в качестве первичных ключей, что не самая популярная практика проектирования баз данных ,Такие первичные ключи занимают больше места, чем необходимо, и с течением времени могут изменяться (даже если первоначальная версия приложения не планирует это поддерживать).Ох, и я забыл их чувствительность к сопоставлениям.Вместо того, чтобы идентифицировать записи по строкам Unicode, при вставке записей используйте схему базы данных , генерирующую бессмысленных последовательных целых чисел, и переводите строки Unicode в простые атрибуты записей.Таким образом, они могут быть такими же или разными, как вам угодно.
Может быть еще полезно нормализовать их перед сохранением с целью поиска и более безопасной последующей обработки;но используемый вами порядок сортировки без учета регистра больше не будет вас каким-либо образом ограничивать.
1 Практически то же самое в случае нормализации совместимости в противоположностьк канонической нормализации.