Quiero eliminar los acentos y, en general, las marcas diacríticas de una cadena para iniciar una búsqueda insensible al acento. Sobre la base de un poco de lectura en las clases de caracteres Unicode, se me ha ocurrido con esto:Eliminar acentos de un QString
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;
}
Parece que funciona razonablemente bien para idiomas latinos, pero me pregunto acerca de su idoneidad en otros alfabetos: árabe , cirílico, CJK ... que no puedo probar debido a la falta de comprensión cultural de estos.
Específicamente Me hubiera gustado saber:
- ¿Qué forma de normalización Unicode es más adecuado para este problema:
NormalizationForm_KD
oNormalizationForm_D
? - ¿Es suficiente eliminar los caracteres que pertenecen a las categorías
Mark_NonSpacing
yMark_SpacingCombining
o debe incluir más categorías? - ¿Existen otras mejoras en el código anterior que lo hagan funcionar lo mejor posible para todos los idiomas?
usted manera también quieren 'QChar :: Mark_Enclosing' –
La cuestión de NFD vs NFKD es algo que necesita para decidir sobre la base de lo que está tratando de hacer. Consulte "Figura 6" de [Formas de normalización Unicode] [1] para decidir si desea descomponer un carácter en esa medida. Sospecho que quieres NFD. –
@Dave: Supongo que [1] fue: http://www.unicode.org/reports/tr15/ –