Es hängt von den Anforderungen ab. Für die meisten Anwendungen reicht es aus, auf NFD zu normalisieren und dann alle kombinierenden Zeichen herauszufiltern. In einigen Fällen ist eine Normalisierung auf NFKD geeigneter (wenn Sie auch weitere Unterscheidungen zwischen Zeichen entfernen möchten).
Einige andere Unterscheidungen werden dadurch nicht erfasst, insbesondere gestrichene lateinische Zeichen. Es gibt auch keine eindeutige, nicht länderspezifische Methode für einige (sollte als gleichwertig mit l oder w betrachtet werden), so dass Sie möglicherweise darüber hinaus anpassen müssen.
Es gibt auch einige Fälle, in denen NFD und NFKD nicht ganz wie erwartet funktionieren, um Konsistenz zwischen Unicode-Versionen zu ermöglichen.
Daraus folgt:
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding)
{
foreach(char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD))
switch(CharUnicodeInfo.GetUnicodeCategory(c))
{
case UnicodeCategory.NonSpacingMark:
case UnicodeCategory.SpacingCombiningMark:
case UnicodeCategory.EnclosingMark:
//do nothing
break;
default:
yield return customFolding(c);
break;
}
}
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding)
{
StringBuilder sb = new StringBuilder();
foreach(char c in RemoveDiacriticsEnum(src, compatNorm, customFolding))
sb.Append(c);
return sb.ToString();
}
public static string RemoveDiacritics(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
Hier haben wir einen Standard für die Problemfälle oben erwähnt, die sie nur ignoriert. Wir haben auch den Aufbau einer Zeichenkette vom Erzeugen der Aufzählung von Zeichen getrennt, so dass wir keine Verschwendung in Fällen brauchen, in denen keine String-Manipulation auf das Ergebnis notwendig ist (sagen wir, würden wir die Zeichen als nächstes ausgeben oder ein weiteres Zeichen machen) -von-Char-Manipulation).
Ein Beispielfall für etwas, wo wir L und L bis L und L, hatte aber keine andere spezialisierte Bedenken nutzen könnten, um auch konvertieren wollte:
private static char NormaliseLWithStroke(char c)
{
switch(c)
{
case 'ł':
return 'l';
case 'Ł':
return 'L';
default:
return c;
}
}
Mit diesem mit den obigen Verfahren die entfernen kombinieren Schlag in diesem Fall zusammen mit den zerlegbaren diakritischen Zeichen.
Verdammt, möchte meine Wiedereröffnung rückgängig machen - es ist definitiv ein Duplikat. @BrunoLM, wenn Sie die Antwort nicht mögen, ist es besser, ein Kopfgeld darauf zu setzen, dass eine dup –