Chcę usunąć akcenty i bardziej ogólnie znaki diakrytyczne z ciągu, aby zainicjować wyszukiwanie niewrażliwe na akcent. podstawie jakiegoś czytania w klasach znaków Unicode, mam wymyślić to:Usuwanie akcentów z QStringa
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ę dość dobrze pracować dla języków opartych na alfabecie łacińskim, ale zastanawiam się o jego adekwatności w innych alfabetów: arabski , cyrylica, CJK ... którego nie mogę przetestować z powodu braku zrozumienia kulturowego.
Konkretnie Chciałbym wiem:
- Jaką formę normalizacji Unicode lepiej nadaje się do tego problemu:
NormalizationForm_KD
lubNormalizationForm_D
? - Czy wystarczy usunąć znaki należące do kategorii
Mark_NonSpacing
i , czy powinna ona zawierać więcej kategorii? - Czy są inne ulepszenia powyższego kodu, które sprawią, że będzie działać jak najlepiej dla wszystkich języków?
sposób chcą Państwo również 'QChar :: Mark_Enclosing' –
kwestia NFD vs NFKD jest coś trzeba zdecydować, na podstawie tego, co staramy się robić. Zobacz "Figure 6" [Unicode Normalization Forms] [1], aby zdecydować, czy chcesz rozłożyć postać w tym zakresie. Podejrzewam, że chcesz NFD. –
@Dave: Zakładam, że [1] był: http://www.unicode.org/reports/tr15/ –