为什么在删除Accents/Diacritics时不会将D扁平化为D.

Mla*_*dic 17 .net c# string diacritics

我正在使用此方法从我的字符串中删除重音:

static string RemoveAccents(string input)
{
    string normalized = input.Normalize(NormalizationForm.FormKD);
    StringBuilder builder = new StringBuilder();
    foreach (char c in normalized)
    {
        if (char.GetUnicodeCategory(c) !=
        UnicodeCategory.NonSpacingMark)
        {
            builder.Append(c);
        }
    }
    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

但是这个方法使đ为đ,并且不会将其更改为d,即使d是其基本字符.您可以使用此输入字符串"æøåáâăäĺćçčéęěěîďđńňóôőöřůúűüýţ"进行尝试

字母đ中有什么特别之处?

Bra*_*ger 14

为什么它不起作用的答案是"d是它的基本字符"的陈述是错误的.U + 0111(LATIN SMALL LETTER D WITH STROKE)具有Unicode类别"Letter,Lowercase"并且没有分解映射(即,它不会分解为"d",后面跟着组合标记).

"?".Normalize(NormalizationForm.FormD)简单地返回"?",它不会被循环剥离,因为它不是非间距标记.

"ø"和其他Unicode不提供分解映射的字母也存在类似的问题.(如果你试图找到代表Unicode字母的"最佳"ASCII字符,这种方法对西里尔字母,希腊字母,中文字母或其他非拉丁字母表都不起作用;如果你发现问题,你也会遇到问题例如,你想将"ß"音译成"ss".使用像UnidecodeSharp这样的库可能会有帮助.)