UTF-8 -> ASCII en langage C

J’ai une question simple que je ne trouve nulle part sur Internet. Comment puis-je convertir UTF-8 en ASCII (principalement des caractères accentués pour le même caractère sans accent) en C en utilisant uniquement la bibliothèque standard? J’ai trouvé des solutions à la plupart des langues, mais pas pour le langage C en particulier.

Merci!

EDIT: Certains des types gentils qui ont commenté m’ont incité à vérifier ce dont j’avais besoin et j’ai exagéré. J’ai seulement besoin d’une idée sur la façon de créer une fonction qui fait: caractère avec accent -> caractère sans accent. 🙂

Il n’y a pas de manière intégrée de faire cela. Il y a vraiment peu de différence entre UTF-8 et ASCII, sauf si vous parlez de caractères de haut niveau, qui ne peuvent de toute façon pas être représentés en ASCII.

Si vous souhaitez un mappage spécifique (par exemple, avec un accent -> a), vous devez probablement le gérer comme une opération de remplacement de chaîne.

Jetez un coup d’œil à libiconv . Même si vous insistez pour le faire sans bibliothèques, vous y trouverez peut-être une inspiration.

En général, vous ne pouvez pas. UTF-8 couvre beaucoup plus que des caractères accentués.

Chaque bibliothèque de support Unicode décente (pas la bibliothèque standard bien sûr) a un moyen de décomposer une chaîne au format KC ou KD. Ce qui sépare les signes diacritiques des lettres. Vous permettant de les filtrer. Pas si sûr que cela vaille la peine d’être poursuivi, le résultat est juste du charabia pour le lecteur de langue maternelle et toutes les lettres ne sont pas décomposables. En d’autres termes, ordure avec points d’interrogation.

Comme il s’agit d’un devoir, j’imagine que votre professeur n’a aucune idée de ce qu’est UTF-8, il est probablement coincé dans les années 1980 avec des “pages de code” et des “caractères ASCII étendus” vous ne l’avez pas déjà) Votre enseignant souhaite probablement que vous écriviez une table de consultation sur 128 octets qui mappe des octets CP437 ou Windows-1252 dans la plage 128-255 à des lettres ASCII d’aspect similaire. Ça irait quelque chose comme …

 void ssortingp_accents(unsigned char *dest, const unsigned char *src) { static const unsigned char lut[128] = { /* mapping here */ }; do { *dest++ = *src < 128 ? *src : lut[*src]; } while (*src++); }