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_KDNormalizationForm_D
  2. 删除属于Mark_NonSpacingMark_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 回答