dimanche 19 décembre 2010

Ignorer les diacritiques (accent, trema...) en Gtk

Dans la prochaine version qui va arriver incessamment sous peu, j'ai pas mal travaillé à améliorer la fonction de recherche des chaînes.

Tout d’abord si vous recherchez une chaîne et qu'un groupe ne comporte aucun résultat, il ne sera plus visible dans la liste des résultats. On y gagne en clarté.

Ensuite, on m'a demandé de ne plus prendre en compte les diacritiques (diacritics en anglais) lors de la recherche d'une chaîne TV. Les diacritiques sont les petits symboles qui accompagne les lettres tel que les accents, trémas, points...

Du coup, par défaut si on cherche Ouï FM et que l'on tapait dans la recherche Oui, on ne trouvait pas la chaîne car Ouï et Oui, c'est différent.

J'ai donc fait le nécessaire qui consiste à juste convertir les 2 chaînes de caractères (celle cherché et celle du nom de la chaîne) et en chaînes de caractères sans diacritique.

Pour ceux que ça intéresse voici une fonction qui fait ça simplement :
gchar*
g_utf8_removediacritics(const gchar *str, gssize len)
{
gchar *szNormalizedString;
GString* szStringBuilder;
gchar *szRes = NULL;
gunichar c;
gchar *szPtr = NULL;

if(str != NULL){
szNormalizedString = g_utf8_normalize (str, len, G_NORMALIZE_NFD);

szStringBuilder = g_string_new ("");

szPtr = szNormalizedString;
while(szPtr){
c = g_utf8_get_char(szPtr);
if(c != '\0'){
if (!g_unichar_ismark(c)){
g_string_append_unichar (szStringBuilder, c);
}
szPtr = g_utf8_next_char (szPtr);
}else{
szPtr = NULL;
}
}

szRes = g_string_free (szStringBuilder, FALSE);
g_free(szNormalizedString);
}

return szRes;
}
En gros, on normalise la chaîne UTF-8 selon la norme NFD (c'est à dire qu'on va convertir la chaîne originale, en séparant les caractères de leur diacritiques (genre "à" va être remplacer par "a`" selon le codage UTF-8). Ensuite, on prend la chaîne et on la recopie en supprimant tout les caractères du type diacritique "ismark".

Voilà pour la petite anecdote.