2010-10-25 5 views
2

J'écris un programme C pour rechercher un grand nombre de chaînes UTF-8 dans une base de données. Certaines de ces chaînes contiennent des caractères anglais avec des didactiques, tels que des accents, etc. La chaîne de recherche est entrée par l'utilisateur, donc il ne contiendra probablement pas de tels caractères. Existe-t-il un moyen (fonction, bibliothèque, etc.) de supprimer ces caractères d'une chaîne, ou simplement d'effectuer une recherche didactique-insensible? Par exemple, si l'utilisateur entre la chaîne de recherche "moteur", elle doit correspondre à la chaîne "moto ̈ rhead".Suppression des symboles diacritiques de la chaîne UTF8 dans C

Ma première tentative a été de dépouiller manuellement les modificateurs combinés didactiques décrits ici:

http://en.wikipedia.org/wiki/Combining_character

Cela a fonctionné dans certains cas, mais il se révèle beaucoup de ces personnages ont aussi des valeurs unicode spécifiques. Par exemple, le caractère "o ̈" ci-dessus peut être représenté par un "o" suivi de la combinaison didactique U + 0308, mais il peut aussi être représenté par le seul caractère unicode U + 00F6, et ma méthode ne filtre que la première.

J'ai également examiné iconv, qui peut convertir de UTF8 en ASCII. Cependant, je pourrais vouloir localiser mon programme à une date ultérieure, ce qui causerait sans doute des problèmes pour les langues avec des caractères non anglais. Y a-t-il une manière que je peux simplement dépouiller/convertir ces caractères accentués?

Édition: erreur supprimée dans le titre de la question.

+0

Vous voulez probablement dire * diacritiques * http://en.wikipedia.org/wiki/Diacritic pas * didactique *? – kriss

+0

C'était un commentaire didactique. –

+0

Tout le monde apprend parfois ... – kriss

Répondre

4

Convertir en one of the decomposed normalizations - probablement NFD, mais vous pouvez vouloir NFKD même - qui fait que tous les signes diacritiques combinent des caractères qui peuvent être supprimés.

Vous aurez besoin d'une bibliothèque pour cela. J'entends de bonnes choses à propos de ICU.

1

, créer un collator sur "root" avec la force de PRIMARY (L1) (qui utilise seulement des lettres de base, se soucie seulement de 'o' et ignore 'ö') alors vous pouvez utiliser les fonctions de recherche de l'ICU. Il y a une nouvelle fonctionnalité search collator qui fournira des collecteurs spéciaux conçus pour ce cas, mais la «force primaire» gérera ce cas spécifique. Par exemple "motor == mötor" in the 'collated' section.

Questions connexes