Как поместить строки в ведра, не зависящие от культуры?

Мое приложение должно иметь дело со строками, которые могут содержать символы с акцентом. Мне нужно иметь возможность сгруппировать эти имена в ведра для разных букв алфавита.

Первоначально я думал об использовании сравнения строк CultureInvariant в.Net, но есть две проблемы с этим:

  1. На самом деле это не говорит о том, что буква C такая же, как и у Cedilla, но мне нужно это равенство.

  2. 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");
}
Другие вопросы по тегам