C# Сопоставить все возможные символы с алфавитом

Я пытаюсь отобразить все возможные буквы на буквы AZ, # для цифр и, возможно, & для других символов. Для этого я использую Normalize(NormalizationForm) метод. Это избавляет от большинства нежелательных персонажей, таких как персонажи с акцентами и так далее.

Однако это не касается дубликатов. Кажется, что буква М находится в более чем одной позиции, и, следовательно, проверка на равенство не проходит.

Вот мой код, который проверяет каждую возможную букву:

for (uint i = char.MinValue; i <= char.MaxValue; i++)
{
    char normalizedChar = char.ToUpper($"{(char)i}".Normalize(System.Text.NormalizationForm.FormKD).FirstOrDefault());
    if (Char.IsLetter((char)i) && !allowedLetters.Contains(normalizedChar))
        throw new Exception();
}

Где allowLetters - массив символов, содержащий все буквы алфавита и '#'.

Это терпит неудачу в i = 181, который нормализован 924 = 'M' точно так же как 77 = 'M'.

Я также открыт для лучших способов нормализации символа, поскольку единственный метод, который я смог найти, работает только со строками.

1 ответ

Страница MSDN NormalizationForm явно предупреждает об этом:

Некоторые последовательности Юникода считаются эквивалентными, поскольку они представляют один и тот же символ. (...) Тем не менее, порядковые, то есть бинарные, сравнения считают эти последовательности разными, потому что они содержат разные значения кода Unicode. Перед выполнением порядкового сравнения приложения должны нормализовать эти строки, чтобы разложить их на основные компоненты.

Это примечание о том, что "приложения должны нормализоваться" означает, что у вас есть работа, которую нужно выполнить в вашем приложении. Я подозреваю, что вам придется делать некоторые ручные карты, экс map[char(924)] = char(77) или похожие.

Другие вопросы по тегам