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.

2 commentaires:

  1. Mouais, c'est pas ça qui va améliorer le niveau moyen d'orthographe... :(
    « 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. »
    Je trouve ça absolument normal et logique, à moins que d'aucuns incultes ne connaissent pas le participe passé du verbe ouïr et le confondent avec la marque d'acceptation, prenant au passage les créateurs de cette radio pour de sombres crétins. Comme indiqué, oui et ouï sont différents, et ce n'est pas pour rien.

    RépondreSupprimer
  2. Oui mais le problème c'est que suivant la source de la playslist, on est pas sûr que le format soit correctement respecté. C'est notamment le cas de "France ô", où le "^" est souvent omis. Qui plus est, on a souvent pas trop envie de taper les caractères spéciaux pour notre recherche, encore le "é" est rapide mais le "ô", c'est plus chiant.

    Mais après je suis d'accord c'est à double sens. Je peux toujours rajouter une option pour laisser le choix.

    RépondreSupprimer