8

アクセントを区別しない検索を開始するために、文字列からアクセントと、より一般的には分音記号を削除したいと考えています。Unicode文字クラスに関するいくつかの読書に基づいて、私はこれを思いつきました:

 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;
 }

ラテン語ベースの言語ではかなりうまく機能しているようですが、アラビア語、キリル文字、CJK などの他のアルファベットでの妥当性について疑問に思っています...これらの文化的な理解が不足しているため、テストできません。

具体的には、次のことを知りたいです。

  1. この問題により適した Unicode 正規化形式はどれNormalizationForm_KDですかNormalizationForm_D?
  2. カテゴリに属する​​文字を削除するだけで十分ですか、それともカテゴリを追加する必要がありますかMark_NonSpacing?Mark_SpacingCombining
  3. すべての言語で可能な限り最適に動作するように、上記のコードに他に改善点はありますか?
4

1 に答える 1

2
QString unaccent(const QString s)
{
    QString output(s.normalized(QString::NormalizationForm_D));
    return output.replace(QRegExp("[^a-zA-Z\\s]"), "");
}
于 2012-10-09T18:48:29.507 に答える