Я пытаюсь сопоставить все возможные буквы с буквами A-Z, # для цифр и, возможно, & для других символов. Для этого я использую метод Normalize(NormalizationForm)
. Это избавляет от большинства нежелательных персонажей, таких как персонажи с акцентами и так далее.C# Карта всех возможных символов в алфавит
Однако это не касается дубликатов. Кажется, что буква M находится в более чем одной позиции, и поэтому проверка равенства не выполняется.
Вот мой код, который проверяет все возможные буквы:
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();
}
Где allowedLetters представляет собой массив символов, содержащий все буквы алфавита и «#».
Он не работает при i = 181, который нормализован 924 = 'M', как 77 = 'M'.
Я также открыт для улучшения способов нормализации символа, поскольку единственный метод, который я мог найти, работает только с строками.
Что вы подразумеваете под «всеми возможными буквами»? Буквы Юникода включают латинский, греческий, кириллический, иврит, арабский и т. Д. Я не вижу, как вы могли бы сопоставить все эти данные с A-Z без получения дубликатов. –
хорошо char имеет ширину 2 байта, поэтому, если вы посмотрите на цикл for, я пройду все возможные значения, и если Char.IsLetter верен, я проверяю, является ли нормализованный символ в массиве allowedLetters, который содержит символы 'A' - 'Z'. И что вы подразумеваете под дубликатами. Как я уже сказал, моя проблема - эти дубликаты, и я хотел бы сопоставить их с одним значением. –
OK. Число 181 является Unicode «MICRO SIGN» μ. Что вы хотите, чтобы «нормализованный» персонаж был? –