我正在尝试将所有可能的字母映射到字母A-Z,#代表数字,也许&对于其他角色。
为此,我使用Normalize(NormalizationForm)
方法。
这消除了大多数不需要的字符,如带有重音符号的字符等。
然而,它不涉及重复。看起来字母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是一个char数组,包含所有字母和'#'。
在i = 181时失败,归一化为924 ='M',就像77 ='M'。
我也有更好的方法来规范化角色,因为我找到的唯一方法只适用于字符串。
答案 0 :(得分:0)
NormalizationForm MSDN page明确警告:
某些Unicode序列被认为是等效的,因为它们代表相同的字符。(...) 但是,序数,即二进制,比较认为这些序列不同,因为它们包含不同的Unicode代码值。在执行序数比较之前,应用程序必须规范化这些字符串以将它们分解为基本组件。
关于&#34;应用程序的说明必须正常化&#34;意味着您需要在应用程序中执行一些工作。我怀疑你将不得不做一些手绘图,ex map[char(924)] = char(77)
或类似的。