Как поместить строки в ведра, не зависящие от культуры?
Мое приложение должно иметь дело со строками, которые могут содержать символы с акцентом. Мне нужно иметь возможность сгруппировать эти имена в ведра для разных букв алфавита.
Первоначально я думал об использовании сравнения строк CultureInvariant в.Net, но есть две проблемы с этим:
На самом деле это не говорит о том, что буква C такая же, как и у Cedilla, но мне нужно это равенство.
WinRT-версия.Net нигде не имеет CultureInvariant в качестве опции.
Может кто-нибудь предложить алгоритм или хотя бы отправную точку, которую я мог бы использовать, чтобы попытаться сгруппировать разные буквы вместе?
Благодарю.
2 ответа
Этот пост, есть ли альтернатива String.Normalize() в WinRT?, имеет решение, которое было отмечено как ответ. Я не проверял это, но прокомментирую здесь, когда у меня будет.
Существует код (созданный Майклом С. Капланом и упомянутый в нескольких постах), который подходит для большинства ситуаций:
static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
Я проверил это с Ç/C и с буквами с / без акцентов и отлично работает (даже с апострофами). В любом случае вам, возможно, придется дополнить это словарным подходом или набором условий /switch...case, чтобы учесть все возможные возможные варианты. Например:
if (inputString.Contains("ß"))
{
inputString = inputString.Replace("ß", "ss");
}