2015-08-19 3 views
0

Я пытаюсь сопоставить все возможные буквы с буквами 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'.

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

+0

Что вы подразумеваете под «всеми возможными буквами»? Буквы Юникода включают латинский, греческий, кириллический, иврит, арабский и т. Д. Я не вижу, как вы могли бы сопоставить все эти данные с A-Z без получения дубликатов. –

+0

хорошо char имеет ширину 2 байта, поэтому, если вы посмотрите на цикл for, я пройду все возможные значения, и если Char.IsLetter верен, я проверяю, является ли нормализованный символ в массиве allowedLetters, который содержит символы 'A' - 'Z'. И что вы подразумеваете под дубликатами. Как я уже сказал, моя проблема - эти дубликаты, и я хотел бы сопоставить их с одним значением. –

+0

OK. Число 181 является Unicode «MICRO SIGN» μ. Что вы хотите, чтобы «нормализованный» персонаж был? –

ответ

0

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

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

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

+0

К сожалению, использование жесткокодированной таблицы для сопоставления других символов не будет работать, поскольку Char.IsLetter, кажется, принимает несколько тысяч символов, которые нормализованы не в латинском алфавите. Я предполагаю, что я просто сопоставил все символы, которые не были нормализованы до латинского последнего для какого-либо другого персонажа. –

+0

хотя, кажется, есть способ, так как список приложений в Windows 10 сортирует эти буквы, как ожидалось. ĸ отображается на K, хотя нормализация его не меняет. (Хотя это не имеет большого смысла, так как они просто выглядят довольно близко) –

+0

Вы сортируете или просто нормализуете латинские символы или что? Вы не представляете четкую картину своей конечной цели здесь. –

Смежные вопросы