Akzente aus einem QString entfernen [duplizieren]
Diese Frage hat hier bereits eine Antwort:
So entfernen Sie Akzente / diakritische Zeichen aus einer Zeichenfolge in Qt? 4 AntwortenIch möchte Akzente und allgemein diakritische Zeichen aus einer Zeichenfolge entfernen, um eine akzentunabhängige Suche einzuleiten. Ausgehend von einigen Lektüren zu Unicode-Zeichenklassen habe ich Folgendes herausgefunden:
QString unaccent(const QString s)
{
QString s2 = s.normalized(QString::NormalizationForm_D);
QString out;
for (int i=0,j=s2.length(); i<j; i++)
{
// strip diacritic marks
if (s2.at(i).category()!=QChar::Mark_NonSpacing &&
s2.at(i).category()!=QChar::Mark_SpacingCombining)
{
out.append(s2.at(i));
}
}
return out;
}
Es scheint für lateinischsprachige Sprachen recht gut zu funktionieren, aber ich frage mich, ob es für andere Alphabete geeignet ist: Arabisch, Kyrillisch, CJK ..., die ich aufgrund mangelnder kultureller Kenntnisse nicht testen kann.
Konkret würde ich gerne wissen:
Welche Unicode-Normalisierungsform ist für dieses Problem besser geeignet:NormalizationForm_KD
oderNormalizationForm_D
?Reicht es aus, die dazugehörigen Zeichen zu entfernen?Mark_NonSpacing
undMark_SpacingCombining
Kategorien oder sollte es mehr Kategorien enthalten?Gibt es weitere Verbesserungen am obigen Code, die es für alle Sprachen so gut wie möglich machen würden?