Usuwanie akcentów z QString [duplikat]
To pytanie ma już tutaj odpowiedź:
Jak usunąć akcenty / znaki diakrytyczne z ciągu w Qt? 4 odpowiedziChcę usunąć akcenty i bardziej ogólnie znaki diakrytyczne z łańcucha, aby rozpocząć wyszukiwanie niewrażliwe na akcent. Opierając się na niektórych lekturach klas znaków Unicode, wymyśliłem to:
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;
}
Wydaje się, że działa dobrze w przypadku języków łacińskich, ale zastanawiam się nad jego adekwatnością w innych alfabetach: arabskim, cyrylicy, CJK ... których nie mogę przetestować z powodu braku ich kulturowego zrozumienia.
W szczególności chciałbym wiedzieć:
Jaki format normalizacji Unicode jest lepiej dostosowany do tego problemu:NormalizationForm_KD
lubNormalizationForm_D
?Czy wystarczy usunąć należące do niego postacieMark_NonSpacing
iMark_SpacingCombining
kategorie lub czy powinien zawierać więcej kategorii?Czy istnieją inne ulepszenia powyższego kodu, które sprawią, że będzie działać najlepiej, jak to możliwe, dla wszystkich języków?