将所有可能的字符映射到字母表

本文关键字:映射 字母表 字符 有可能 | 更新日期: 2023-09-27 18:08:50

我试图将所有可能的字母映射到字母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是一个字符数组,包含字母表中的所有字母和'#'。

它在i = 181处失败,这是标准化的924 = 'M',就像77 = 'M'一样。

我也愿意寻找更好的方法来规范化字符,因为我能找到的唯一方法只适用于字符串。

将所有可能的字符映射到字母表

NormalizationForm MSDN页面明确警告:

一些Unicode序列被认为是等价的,因为它们表示相同的字符。(…)但是,顺序比较(即二进制比较)认为这些序列不同,因为它们包含不同的Unicode码值。在执行顺序比较之前,应用程序必须对这些字符串进行规范化,将它们分解为基本组件。

关于"应用程序必须规范化"的注释意味着您在应用程序中有一些工作要执行。我怀疑你将不得不做一些手工映射,例如map[char(924)] = char(77)或类似的