从QString中删除重音符号

时间:2012-09-05 09:35:33

标签: qt unicode

我想从字符串中删除重音符号和更一般的变音符号以启动不区分重音的搜索。 基于对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. 上述代码是否有其他改进措施可以使所有语言尽可能地发挥作用?

1 个答案:

答案 0 :(得分:2)

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