从QString中删除重音符号

Dan*_*ité 8 unicode qt

我想从字符串中删除重音符号和更一般的变音符号以启动重音不敏感搜索.基于对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;
 }
Run Code Online (Sandbox Code Playgroud)

对于基于拉丁语的语言似乎工作得相当好,但我想知道它对其他字母表的充分性:阿拉伯语,西里尔语,CJK ......由于缺乏对这些语言的文化理解,我无法测试.

具体来说,我希望我知道:

  1. 什么Unicode规范化形式更适合这个问题:NormalizationForm_KDNormalizationForm_D
  2. 是否足以删除属于Mark_NonSpacingMark_SpacingCombining类别的字符或是否应包含更多类别?
  3. 上述代码是否有其他改进可以使所有语言尽可能地发挥作用?

小智 2

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

  • 这段代码剥离了太多。拉丁字母以外的数字、标点符号和非重音字符必须保留,而此代码将删除它们。除变音符号外的任何内容都必须保留。 (2认同)