Ich möchte Akzente und allgemein diakritische Zeichen aus einer Zeichenfolge entfernen, um eine akzentunabhängige Suche zu initiieren. Basierend auf etwas zu lesen auf Unicode-Zeichenklassen, ich habe mit diesem kommen:Entfernen von Akzenten aus einem QString
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 latin-basierten Sprachen recht gut zu funktionieren, aber ich frage mich, um seine Eignung auf anderen Alphabeten: arabisch , kyrillisch, CJK ... was ich aufgrund mangelnder kultureller Kenntnisse nicht testen kann.
Insbesondere möchte ich ich weiß, würde:
- Was Unicode-Normalisierungsform besser für dieses Problem geeignet ist:
NormalizationForm_KD
oderNormalizationForm_D
? - Reicht es aus, die zu den Kategorien
Mark_NonSpacing
undMark_SpacingCombining
gehörenden Zeichen zu entfernen, oder sollte es weitere Kategorien enthalten? - Gibt es weitere Verbesserungen des obigen Codes, die es für alle Sprachen so gut wie möglich machen würden?
Sie Art und Weise wollen auch 'QChar :: Mark_Enclosing' –
Die Frage der NFD vs NFKD etwas, das Sie basiert entscheiden müssen, was Sie zu tun versuchen. Siehe "Abbildung 6" von [Unicode Normalization Forms] [1], um zu entscheiden, ob ein Zeichen in diesem Umfang zerlegt werden soll. Ich vermute du willst NFD. –
@Dave: Ich nehme an, [1] war: http://www.unicode.org/reports/tr15/ –