2012-09-05 14 views
6

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:

  1. Was Unicode-Normalisierungsform besser für dieses Problem geeignet ist: NormalizationForm_KD oder NormalizationForm_D?
  2. Reicht es aus, die zu den Kategorien Mark_NonSpacing und Mark_SpacingCombining gehörenden Zeichen zu entfernen, oder sollte es weitere Kategorien enthalten?
  3. Gibt es weitere Verbesserungen des obigen Codes, die es für alle Sprachen so gut wie möglich machen würden?
+1

Sie Art und Weise wollen auch 'QChar :: Mark_Enclosing' –

+0

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. –

+0

@Dave: Ich nehme an, [1] war: http://www.unicode.org/reports/tr15/ –

Antwort

0
QString unaccent(const QString s) 
{ 
    QString output(s.normalized(QString::NormalizationForm_D)); 
    return output.replace(QRegExp("[^a-zA-Z\\s]"), ""); 
} 
+2

Dieser Code Streifen zu viel. Ziffern, Interpunktionszeichen und nicht akzentuierte Zeichen außerhalb des lateinischen Alphabets müssen beibehalten werden, während dieser Code sie entfernt. Alles außer diakritischen Zeichen muss beibehalten werden. –

Verwandte Themen