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

时间:2015-08-19 15:49:24

标签: c# string unicode normalization unicode-normalization

我正在尝试将所有可能的字母映射到字母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'。

我也有更好的方法来规范化角色,因为我找到的唯一方法只适用于字符串。

1 个答案:

答案 0 :(得分:0)

NormalizationForm MSDN page明确警告:

  

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

关于&#34;应用程序的说明必须正常化&#34;意味着您需要在应用程序中执行一些工作。我怀疑你将不得不做一些手绘图,ex map[char(924)] = char(77)或类似的。